精华内容
下载资源
问答
  • 多个程序访问同一个数据库
    千次阅读
    2022-04-26 22:30:12

    目录

    一、QSqlDatabase概述

    二、QSqlDatabase模块的使用

    三、多线程操作同一个链接

    1、testsqldatabase.cpp

    2、thread1.cpp

    3、thread2.cpp

    四、总结


    一、QSqlDatabase概述

           QSqlDatabase提供了一系列的接口用于访问操作数据库,包括连接数据库,输入sql语句等。
    QSqlDatabase的实例表示着一个对数据库的连接。该连接通过一个受支持的数据库驱动程序(从QSqlDriver派生)提供对数据库的访问。另外,可以从QSqlDriver子类化自己的数据库驱动程序。(如何创建自己的驱动,详见其他文档)Qt支持的数据库有很多,自己首先接触到的是QODBC(用于sql server)。另外还有QSQLITE、QDB2、QIBASE、QMYSQL等。

    二、QSqlDatabase模块的使用

    QSqlDatabase类处理与数据库的连接,要使用这个类,头文件需要导入QSqlDatabase库:

    #include <QSqlDatabase>
    

    在qmake.pro文件中加入SQL数据库支持:

    QT += sql
    

        这个类提供了以下公共方法:QSqlDatabase::addDatabase、QSqlDatabase::removeDatabase和QSqlDatabase::database函数都是线程安全的。

    三、多线程操作同一个链接

    1、testsqldatabase.cpp

    #include "testqtdatabase.h"
    #include "thread1.h"
    #include "thread2.h"
    #include <QSQLDatabase>
    #include <QSqlQuery>
    #include <QSqlError>
    
    testqtdatabase::testqtdatabase(QWidget *parent, Qt::WFlags flags)
    	: QMainWindow(parent, flags)
    {
    	m_db = new QSqlDatabase();
    	*m_db=QSqlDatabase::addDatabase("QSQLITE","test");
    	QSqlDatabase & db=*m_db;
    	db.setDatabaseName("test.db");
    	bool b=db.open();
    	QSqlQuery query(db);
    	if(!query.exec("select * from user;"))
    	{
    		QSqlError error = query.lastError();
    	}
    
    
    	QString result="";
    	while(query.next()){
    		result+=query.value(0).toString()+' ';
    		result+='\n';
    	}
    
    
    
    	ui.setupUi(this);
    	Thread1 *t1=new Thread1(NULL);
    	t1->start();
    
    	Thread2 *t2=new Thread2(NULL);
    	t2->start();
    
    	m_t1=t1;
    	m_t2=t2;
    
    }
    
    testqtdatabase::~testqtdatabase()
    {
    	((Thread1*)m_t1)->setStop();
    	((Thread2*)m_t2)->setStop();
    	m_t1->wait();
    	m_t2->wait();
    
    
    	
    	QSqlDatabase::removeDatabase("test");
    	delete m_db;
    	
    }
    

    2、thread1.cpp

    #include "thread1.h"
    #include <QSqlDatabase>
    #include <QSqlQuery>
    #include <QSqlError>
    #include <QVariant>
    Thread1::Thread1(QObject *parent)
    	: QThread(parent)
    {
    	m_bStop=false;
    }
    
    Thread1::~Thread1()
    {
    	
    }
    
    void Thread1::setStop()
    {
    	m_bStop = true;
    }
    
    void Thread1::run()
    {
    	while(true)
    	{
    		if(m_bStop)
    		{
    			break;
    		}
    		{
    
    		
    		QSqlDatabase db=QSqlDatabase::database("test");
    		QSqlQuery query(db);
    		if(!query.exec("select * from user;"))
    		{
    			QSqlError error = query.lastError();
    		}
    
    
    		QString result="";
    		while(query.next()){
    			result+=query.value(0).toString()+' ';
    			result+='\n';
    		}
    		}
    	
    	}
    }
    

    3、thread2.cpp

    #include "thread2.h"
    #include <QSqlDatabase>
    #include <QSqlQuery>
    #include <QSqlError>
    #include <QVariant>
    Thread2::Thread2(QObject *parent)
    	: QThread(parent)
    {
    	 m_bStop=false;
    }
    
    Thread2::~Thread2()
    {
    	
    }
    
    void Thread2::setStop()
    {
    	m_bStop = true;
    }
    
    void Thread2::run()
    {
    	while(true)
    	{
    		if(m_bStop)
    			break;
    		{
    
    		
    		QSqlDatabase db=QSqlDatabase::database("test");
    		QSqlQuery query(db);
    		if(!query.exec("select * from user;"))
    		{
    			QSqlError error = query.lastError();
    		}
    
    
    		QString result="";
    		while(query.next()){
    			result+=query.value(0).toString()+' ';
    			result+='\n';
    		}
    		}
    
    	}
    }
    

    四、总结

            Sqlite数据库是支持多线程读的,但是只支持一个线程写,所以如果要进行多线程读写的话,还需要加上读写锁。

    更多相关内容
  • 我们在做小程序开发时,有时候需要多个程序公用数据库,比如我们做个外卖小程序,要配套个骑手小程序,这个时候就要两个小程序公用个云开发环境,公用数据库了。所以今天来教下大家如何多个程序...

    我们在做小程序开发时,有时候需要多个小程序公用一个数据库,比如我们做一个外卖小程序,要配套一个骑手小程序,这个时候就要两个小程序公用一个云开发环境,公用一个数据库了。所以今天来教下大家如何多个小程序共享一个云开发环境和数据库。

    其实官方给的文档很详细了,但是一个细节官方没有讲到,所以就会导致好多同学做多个小程序共享一个云开发环境时,遇到各种各样的问题。
    比如下面这样的问题

    明明感觉自己按照官方要求,该配置的都配置了啊,但是为啥就是出错呢。所以我这里再带大家完整的配置一遍,把里面的一些注意事项也给大家好强调下。

    一,准备条件

    1-1,必须同一个主体

    首先看官方文档:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/resource-sharing/

    要共享云开发资源可以 ,但是必须是同一个主体。什么是同一个主体呢,就是两个小程序必须都是你自己的,或者是你公司的。
    如果不是同一个主体,会报如下错误

    1-2,最新的基础库,最新版开发工具

    这里记得调到最新的基础库,开发者工具也尽量用最新的

    开发者工具这里官方是有要求的

    二,开通环境共享

    我这里以两个小程序共享一个数据库为例

    小程序A

    小程序B

    大家这里记得我们是小程序A 共享数据库给小程序B

    2-1,开通环境共享

    开通,使用 1.03.2009140 或以上版本的开发者工具,进入云控制台,到 “设置 - 拓展能力 - 环境共享” 点击开通即开通环境共享能力

    2-2,开通后授权给别的小程序


    环境共享开通后将在顶部tab显示环境共享功能,进入 “环境共享” 的页面,点击“添加共享”,即可授权同主体下其他小程序/公众号使用当前小程序下的云开发资源

    这里填写你要共享小程序的appid,我们这里取小程序B的appid

    授权,选择共享的云环境,默认选中所有环境操作权限,可根据实际使用场景自定义授权。这里建议保持默认即可

    比如我这里分享给小程序B(编程小石头)

    2-3,使用共享的云开发环境

    我们上面操作好以后,就可以在小程序B的云开发后台看到共享的云开发环境了。将我们的云开发环境切换下就可以查看和使用共享的资源了。

    可以看到小程序B(编程小石头)可以查看小程序A的数据库了

    三,请求共享的数据库

    我们接下来就在小程序B里调用小程序A的数据库了。官方提示的是调用之前要在小程序A里创建一个如下的云函数,但是我在测试的时候发现不用创建也可以的。

    所以我们就先不创建cloudbase_auth 云函数,来看看能不能调取到数据。

    3-1,初始化云开发环境

    我们小程序B想使用小程序A的云开发环境,这里要注意,初始化的时候要如下面注释里写的一样,用小程序A的appid和云开发环境id

    3-2,调用资源方数据

    初始化以后不能想正常调用云开发数据库那样了,会报错

    所以我们这里要改变下使用方法。如下

    这时候还会报错,是因为我们忽略了官方的一个要求:“ 跨账号调用,必须等待 init 完成”,所以我们必须给init加一个await语法,如下,记得await要结合着async一起使用。

    可以看到我们成功的请求到了小程序A的数据。直接get的时候记得改下数据库权限奥。

    代码贴出来给大家,记得改成自己的配置

    Page({
        async onLoad() {
            // 声明新的 cloud 实例
            var c1 = new wx.cloud.Cloud({
                // 资源方 小程序A的 AppID
                resourceAppid: 'wx7c54942dfc87f4d8',
                // 资源方 小程序A的 的云开发环境ID
                resourceEnv: 'test-ec396a',
            })
    
            // 跨账号调用,必须等待 init 完成
            // init 过程中,资源方小程序对应环境下的 cloudbase_auth 函数会被调用,并需返回协议字段(见下)来确认允许访问、并可自定义安全规则
            await c1.init()
    
            // wx.cloud.database().collection('xiaoshitou').get()
            c1.database().collection('xiaoshitou').get()
                .then(res => {
                    console.log('共享环境请求数据成功', res)
                })
        }
    })
    

    四,调用共享环境的云函数

    4-1,调用资源方里的云函数

    我们这里在小程序B(编程小石头)里调用小程序A里的云函数试试。
    如小程序A里有一个xiaoshitou的云函数

    可以看到我们可以成功的调用小程序A里的xiaoshitou云函数

    是不是很简单。今天就给大家讲到这里了,欢迎关注,后面会分享更多小程序开发的知识给大家。

    展开全文
  • 程序中如何访问mysql数据库

    千次阅读 2022-07-12 10:33:01
    本篇介绍微搭低代码如何接入mysql数据库


    日常我们在开发小程序的时候,总是希望把数据提交回数据库进行存储,那在小程序中该如何访问数据库呢?本篇我们就介绍一下具体的思路

    1 开通云上的mysql

    经过询价,我发现阿里云的数据库是比较便宜的,新人购买非常划算。对于爱学习的博主来说,果断购买一个。

    按照操作指引购买后,云会帮你创建一系列的环境,在控制台就可以看到属于自己的实例
    在这里插入图片描述
    点击操作列上的管理,就可以创建我们自己的数据库。配置的步骤是先创建数据库的账号
    在这里插入图片描述

    然后创建一个数据库
    在这里插入图片描述

    都设置好之后就可以登录数据库,创建表,加数据了
    在这里插入图片描述
    刚创建好的数据库只能内网使用,我们如果希望在小程序里访问还需要开通外网,这里加入白名单即可

    2 创建自定义连接器

    数据库准备好了之后,我们就可以创建自定义连接器来访问数据库了。登录微搭的控制台,点击新建自定义连接器
    在这里插入图片描述
    输入连接器的名称和标识
    在这里插入图片描述
    点击立即创建,创建自定义连接器方法
    在这里插入图片描述
    意图选择查询列表,类型选择云开发云函数
    在这里插入图片描述

    3 创建云函数

    点击新建云函数
    在这里插入图片描述
    录入函数名称
    在这里插入图片描述
    点击确定就可以完成云函数的创建
    在这里插入图片描述

    4 安装依赖

    我们创建好云函数后,从列表上点击函数名称进入
    在这里插入图片描述
    进入后切换到函数代码
    在这里插入图片描述
    如果我们点击保存并安装依赖会提示缺失package.json
    在这里插入图片描述
    在这里插入图片描述
    把内容复制一下,点导航条的文件,创建一个文件,命名为package.json
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    将我们的内容复制到文件里,赋值好之后选中index.js,贴入如下代码

    const mysql = require("mysql2/promise");
    exports.main = async (event, context) => {
        try {
            const connection = await mysql.createConnection({
                host: '你的数据库的公网ip',
                user: '数据库的用户名',
                password: '数据库的密码',
                port: 3306,
                database: '数据库名',
            });
            console.log('已连接')
            const [rows, fields] = await connection.execute('SELECT * FROM `user`;');
                    // 这里可以对返回数据做加工
            return rows;
        } catch(err) {
            console.log('错误连接', err);
            return err;
        }
    };
    

    需要替换成你自己的数据库的对应信息,替换好之后,因为我们引入了mysql的库,先需要安装依赖,在package.json里重新录入如下代码

    {
      "name": "app",
      "version": "1.0.0",
      "description": "",
      "main": "index.js",
      "scripts": {},
      "author": "",
      "license": "ISC",
      "dependencies": {
        "@cloudbase/node-sdk": "latest",
        "mysql2":"latest"
      }
    }
    

    依赖里我们多了一个mysql2的依赖,替换好之后再点击底部的保存并安装依赖按钮,安装对应的库。安装成功之后我们可以在node_modules文件夹下找到mysql2的文件夹
    在这里插入图片描述
    这样依赖就安装好了,依赖安装好之后我们可以点击方法测试,看看是否连接上数据库,数据有没有正确的返回
    在这里插入图片描述
    如果看到成功之后就说明一切都做好了。

    5 出参映射

    云函数创建好之后,我们回到微搭的自定义连接器界面,选择我们刚刚创建好的云函数
    在这里插入图片描述
    点击方法测试,看一下云函数能否正常调用,如果返回成功,就可以点击出参映射了
    在这里插入图片描述
    这样一个自定义连接器就创建好了

    6 在小程序中使用连接器

    连接器相当于我们的后台方法,还需要在前端进行调用,可以创建一个变量,用来接收连接器调用的返回值
    在这里插入图片描述
    在页面的生命周期函数里我们通过api的形式来调用连接器来获取数据
    在这里插入图片描述

    export default {
      async onPageLoad(query) {
        //console.log('---------> LifeCycle onPageLoad', query)
        const result = await app.cloud.callConnector({
            name: 'ljmysql_xi2ad3x',
            methodName: 'ljmysql',
            params: {}, // 方法入参
        });
        console.log(result)
        $page.dataset.state.list = result
      },
      onPageShow() {
        //console.log('---------> LifeCycle onPageShow')
      },
      onPageReady() {
        //console.log('---------> LifeCycle onPageReady')
      },
      onPageHide() {
        //console.log('---------> LifeCycle onPageHide')
      },
      onPageUnload() {
        //console.log('---------> LifeCycle onPageUnload')
      },
    }
    

    数据获取到之后,我们就添加组件,并且给组件绑定值就可以
    在这里插入图片描述
    绑定的时候使用表达式绑定就可以
    在这里插入图片描述

    总结

    我们本篇介绍了如何在微搭低代码中接入mysql数据库,需要先申请一个公有云的库,可以公网访问,然后创建云函数来完成数据的接入。在小程序中就可以将数据绑定到对应的组件上进行展示。如果觉得有用记得点赞、关注加评论哦。

    展开全文
  • springboot连接两个或多个数据库

    千次阅读 2022-04-24 14:49:49
    、实现 一般我们的SpringBoot...1、配置application.yml,添加2个数据库连接 server: port: 8080 spring: datasource: one: driver-class-name: org.postgresql.Driver jdbc-url: jdbc:postgresql:/...

    一、实现

            一般我们的SpringBoot项目只连一个数据库,下面是springboot连接2个以上的数据库方式

    这里连得相同数据库,数据库名不一样做区分

    1、配置application.yml,添加2个数据库连接

    server:
      port: 8080
    
    spring:
      datasource:
      
        one:
          driver-class-name: org.postgresql.Driver
          jdbc-url: jdbc:postgresql://127.0.0.1:5432/test001  #测试数据库
          username: postgres
          password: root
     
        two:
          driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
          jdbc-url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=test002  #测试数据库
          username: sa
          password: sa

    注意:

    (1)test001为主数据库,test002为从

    (2)默认url更改为:jdbc-url

    2、application启动类增加注解

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
    
    //@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class })
    @EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})
    @SpringBootApplication(scanBasePackages = "com")
    public class AcceptApplication {
    
    	public static void main(String[] args) {
    		SpringApplication.run(AcceptApplication.class, args);
    	}
    
    }

    @EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})意为:去掉springboot服务启动时对于数据源配置的自动导入。后面我们会手动配置多个数据源。
    如果有需要,也可把事务管理与mybatis的自动导入去掉,注解为:
    @EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class,DataSourceTransactionManagerAutoConfiguration.class, MybatisAutoConfiguration.class})

    3、使用代码进行数据源注入,和扫描dao层路径

     PostgresConfig.java 为主数据库,项目启动默认连接此数据库

    注意:主数据库PostgresConfig需要 @Primary注解

    import javax.sql.DataSource;
    
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.mybatis.spring.SqlSessionFactoryBean;
    import org.mybatis.spring.SqlSessionTemplate;
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.boot.jdbc.DataSourceBuilder;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Primary;
    import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
    import org.springframework.jdbc.datasource.DataSourceTransactionManager;
    
    @Configuration
    @MapperScan(basePackages = "com.dao.test1",sqlSessionFactoryRef = "test1SqlSessionFactory")
    public class PostgresConfig {
    
    	@Primary
    	@Bean(name = "DataSource1")
        @ConfigurationProperties(prefix = "spring.datasource.one")
        public DataSource testDataSource() {
            return DataSourceBuilder.create().build();
        }
     
    	@Primary
        @Bean(name = "SqlSessionFactory1")
        public SqlSessionFactory testSqlSessionFactory(@Qualifier("DataSource1") DataSource dataSource) throws Exception {
            SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
            bean.setDataSource(dataSource);
            bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:com/dao/test1/*.xml"));
            return bean.getObject();
        }
        
        @Primary
        @Bean(name = "TransactionManager1")
        public DataSourceTransactionManager testTransactionManager(@Qualifier("DataSource1") DataSource dataSource) {
            return new DataSourceTransactionManager(dataSource);
        }
     
        @Primary
        @Bean(name = "SqlSessionTemplate1")
        public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("SqlSessionFactory1") SqlSessionFactory sqlSessionFactory) throws Exception {
            return new SqlSessionTemplate(sqlSessionFactory);
        }
    	
    	
    }

    SqlServerConfig.java 为从数据库,不需要@Primary注解

    import javax.sql.DataSource;
    
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.mybatis.spring.SqlSessionFactoryBean;
    import org.mybatis.spring.SqlSessionTemplate;
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.boot.jdbc.DataSourceBuilder;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.Primary;
    import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
    import org.springframework.jdbc.datasource.DataSourceTransactionManager;
    
    @Configuration
    @MapperScan(basePackages = "com.dao.test2",sqlSessionFactoryRef = "test2SqlSessionFactory")
    public class SqlServerConfig {
    
    	@Bean(name = "DataSource2")
        @ConfigurationProperties(prefix = "spring.datasource.two")
    	public DataSource testDataSource() {
            return DataSourceBuilder.create().build();
        }
     
        @Bean(name = "SqlSessionFactory2")
        public SqlSessionFactory testSqlSessionFactory(@Qualifier("DataSource2") DataSource dataSource) throws Exception {
            SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
            bean.setDataSource(dataSource);
            bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:com/dao/test2/*.xml"));
            return bean.getObject();
        }
        
        @Bean(name = "TransactionManager2")
        public DataSourceTransactionManager testTransactionManager(@Qualifier("DataSource2") DataSource dataSource) {
            return new DataSourceTransactionManager(dataSource);
        }
     
        @Bean(name = "SqlSessionTemplate2")
        public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("SqlSessionFactory2") SqlSessionFactory sqlSessionFactory) throws Exception {
            return new SqlSessionTemplate(sqlSessionFactory);
        }
    	
    }

    4、在dao文件夹下,新建test1和test2两个包,分别放两个不同数据库的dao层文件

    (1)StudentMapper.java

    @Component
    public interface StudentMapper {
        Student selectByPrimaryKey(Integer id);
    }

    (2)StuMapper.java

    @Component
    public interface StuMapper {
        Student selectByPrimaryKey(Integer id);
    }

    5、dao层的xml文件,路径看自己安排

            注意:dao文件名和xml文件名要一致

    (1)StudentMapper.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
    <mapper namespace="com.dao.test1.StudentMapper">
     
      <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
        select * from student
        where id = #{id,jdbcType=INTEGER}
      </select>
     
    </mapper>

    (2)StuMapper.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
    <mapper namespace="com.dao.test1.StudentMapper">
     
      <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
        select * from stu
        where id = #{id,jdbcType=INTEGER}
      </select>
     
    </mapper>

    6、测试,controller控制层,注入两个数据库的dao,分别查询

    @RestController
    @RequestMapping(value = "/stu")
    public class JDBCController {
    
    	@Autowired
    	private StudentMapper studentMapper;
    	
    	@Autowired
    	private StuMapper stuMapper;
    	
    	@GetMapping("/getStudent")
        public Student getStudentByPostgres(){
            return studentMapper.selectByPrimaryKey(2);
        }
    	
    	@GetMapping("/getStu")
        public Stu getStuByPostgres(){
            return stuMapper.selectByPrimaryKey(2);
        }
    	
    }

    7、启动项目,浏览器访问

    http://localhost:8080/stu/getStudent

    {"id":2,"name":"王五","age":24,"sex":"男"}

    http://localhost:8080/stu/getStu

    {"id":2,"name":"李四","age":21,"sex":"女"}

    8、pom

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.0.1</version>
    </dependency>
    
    <!-- 连接数据库postgresql -->
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>42.2.7</version>
    </dependency>
    
    <dependency>
        <groupId>com.microsoft.sqlserver</groupId>
        <artifactId>mssql-jdbc</artifactId>
    </dependency>

    附:配置类内容

    1、SqlSessionFactory

    SqlSessionFactory是MyBatis的关键对象,它是个单个数据库映射关系经过编译后的内存镜像,SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象类获得,而SqlSessionFactoryBuilder则可以从XML配置文件或一个预先定制的Configuration的实例构建出SqlSessionFactory的实例。每一个MyBatis的应用程序都以一个SqlSessionFactory对象的实例为核心,同时SqlSessionFactory也是线程安全的,SqlSessionFactory一旦被创建,应该在应用执行期间都存在,在应用运行期间不要重复创建多次,建议使用单例模式,SqlSessionFactory是创建SqlSession的工厂。

    2、SqlSession

    SqlSession是MyBatis的关键对象,是执行持久化操作的独享,类似于JDBC中的Connection。它是应用程序与持久层之间执行交互操作的一个单线程对象,也是MyBatis执行持久化操作的关键对象。SqlSession对象完全包含以数据库为背景的所有执行SQL操作的方法,它的底层封装了JDBC连接,可以用SqlSession实例来直接执行被映射的SQL语句。每个线程都应该有它自己的SqlSession实例。SqlSession的实例不能被共享,同时SqlSession也是线程不安全的,绝对不能讲SqlSeesion实例的引用放在一个类的静态字段甚至是实例字段中。也绝不能将SqlSession实例的引用放在任何类型的管理范围中,比如Servlet当中的HttpSession对象中,使用完SqlSeesion之后关闭Session很重要,应该确保使用finally块来关闭它。

    3、SqlSession创建过程

    mybatis框架主要是围绕着SqlSessionFactory进行的,创建过程大概如下:

    1. 定义一个Configuration对象,其中包含数据源、事务、mapper文件资源以及影响数据库行为属性设置settings。
    2. 通过配置对象,则可以创建一个SqlSessionFactoryBuilder对象
    3. 通过 SqlSessionFactoryBuilder 获得SqlSessionFactory 的实例。
    4. SqlSessionFactory 的实例可以获得操作数据的SqlSession实例,通过这个实例对数据库进行操作。

    4、SqlSessionTemplate

    SqlSessionTemplate是MyBatis-Spring的核心。这个类负责管理MyBatis的SqlSession,调用MyBatis的SQL方法,翻译异常。SqlSessionTemplate是线程安全的,可以被多个DAO所共享使用。
    当调用SQL方法时,包含从映射器getMapper()方法返回的方法,SqlSessionTemplate将会保证使用的SqlSession是和当前Spring的事务相关的。此外,它管理session的生命周期,包含必要的关闭,提交或回滚操作。
    SqlSessionTemplate实现了SqlSession,这就是说要对MyBatis的SqlSession进行简易替换。
    SqlSessionTemplate通常是被用来替代默认的MyBatis实现的DefaultSqlSession,因为它不能参与到Spring的事务中也不能被注入,因为它是线程不安全的。相同应用程序中两个类之间的转换可能会引起数据一致性的问题。
    SqlSessionTemplate对象可以使用SqlSessionFactory作为构造方法的参数来创建。

    5、DataSourceTransactionManager 核心事务管理器

    对JDBC(Java Data Base Connectivity,java数据库连接)进行事务管理,在spring中是对JdbcTemplate进行事务管理。

    展开全文
  • 众所周知,sqlite数据库支持同时读文件,不支持个读个写。 个方法就是线程,然后 ...比如一个程序读,一个程序写。 我暂时想到的方法是用两个文件。 在某个程序运行的时候,执行bash命令。 ...
  • 1、添加插件(pom.xml) <!-- JPA依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> &...
  • 详解-程序是如何访问数据库的?

    千次阅读 2020-04-15 21:45:10
    应用访问数据库的过程,通过层的抽象,将最初的通过TCP连接传输复杂的协议数据来操作数据,封装成我们现在的简单几配置就能操作数据库中数据,真是太神奇了,下面,我们就从这层抽象入手,看看每层...
  • Springboot配置连接两个或多个数据库

    万次阅读 多人点赞 2020-07-31 16:08:00
    一个SpringBoot项目,同时连接两个数据库:比如一个是pgsql数据库一个是oracle数据库 (啥数据库都一样,连接两同为oracle的数据库,或两不同的数据库,只需要更改对应的driver-class-name和jdbc-url等即可)...
  • 、多进程访问同一数据库是否安全 背景:多个进程代表多个数据库操作instance,每个进程有自己的ApplicationContext。多个进程内存不共享。 写代码做了测试测试代码在最后,虽然sqlite不是线程安全的,但是在...
  • Web端访问微信小程序数据库

    千次阅读 2022-04-10 00:31:49
    Web端访问微信小程序数据库
  • java项目同时访问个数据库的配置

    千次阅读 2020-12-10 11:27:53
    (1)在application.yml配置文件中对两个数据库进行访问配置(任何两种数据库都可以用如下的配置) # ----------------------------------------------------------------> 数据库 datasource: one: driver-...
  • 【云开发】小程序端操作数据库详解

    千次阅读 多人点赞 2022-08-26 22:45:05
    数据库可以包含多个集合,个集合中包含多个JSON对象;提供方便的API调用:学习这些API即可;提供了小程序端和服务器端(云函数)中调用的区分;关系型文档型数据库 database数据库 database表 table集合 collection...
  • JSP访问数据库

    千次阅读 2022-04-25 10:35:21
    JSP访问数据库内容介绍
  • 保持原样不变,但两原本操作同一个表的,改为不同表,建立数据同步机制 背景 环境 Oracle 12c 数据 批量服务器N 应用服务器M 情景 同一时点服务器N要truncat数据,服务器M则要向表中插入数据 Oracle行级锁,...
  • 从单一工具连接多个数据库 许多数据库管理和开发工具支持连接同构的多个数据库,即它们都是相同类型的例如全部都是 MySQL、全部都是 SQL Server、全部都是 Oracle 等。另方面,很少有支持连接异构数据库服务器,...
  • C# 线程如何访问同一个数据

    万次阅读 2016-09-07 14:18:21
    线程中,为了使数据保持一致性必须要对数据或是访问数据的函数加锁,在数据库中这是很常见的,但是在程序中大部分都是单线程的程序,所以没有加锁的必要,但是在线程中,为了保持数据的同步,一定要加锁。...
  • 然而,随着商业需求的日益增加,应用程序变得越来越复杂,经常需要访问多个数据库,这些数据库通常分布在不同的地方,这就是分布式事务。分布式事务修改的数据存储在多个或多种类型的数据源中,这些数据源分布在多台...
  • 1.假设192.168.1.3为服务器2.首先在ip为192.168.1.103的机子上能够ping通运行->...把两台电脑的IP设置在同一个网段,如:192.168.1.2,192.168.1.3。。。。。子网:255.255.255.0网关:192.168.1.14.在mysq...
  • SQLITE数据库多个连接

    千次阅读 2015-10-10 08:59:57
    //记得把上一个连接关闭掉QSqlDatabase::colse();方法。 QSqlDatabase db1 = QSqlDatabase::addDatabase("QSQLITE", "con2");//新连接的名字  db1.setDatabaseName("D:\\space_application\\test_sqlite\\test...
  • 进程访问数据库SQLite问题

    万次阅读 2017-06-07 17:11:01
    一般来说,个APP默认只有个进程,进程名称就是它的包名,我们可以通过... 当然,在一些项目中,可能存在着个APP有多个进程的情况。如上面的“com.instagram.android”和“com.instragram.android.mqtt”其实就
  • 无论是程序员还是用户都能得到更好的体验,目前更是开放了访问微信小程序云开发数据库的api,以后做小程序的项目肯定会遇到外部系统访问程序云开发数据库的场景,在此做一个样例。 话不说,直接看代码和注释吧 ...
  • h2 数据库配置多个连接

    千次阅读 2013-11-19 15:46:25
    目前公司开发Playframework 项目,使用h2 数据库,由于多个人共同开发,为了方便准备连接个h2 数据库。 初步想法是在局域网内搭建个h2 数据库服务器。 步骤如下: 运行h2 jar文件, cd ~/.ivy2/cache/...
  • nodejs连接多个mongodb数据库

    千次阅读 2018-01-03 18:00:26
    nodejs连接多个mongodb数据库参考: http://blog.csdn.net/u011677050/article/details/44302093最近需要将uid生成及管理单独做成个module,所以要将数据库独立出来。就发现个node要链接两个数据库,而使用的...
  • 微信小程序的云开发功能十分方便,无需自己搭建服务器即可实现后台数据服务的管理。...由于每微信公众平台账号只能发布一个程序,因此无法共用同一个云开发环境。此时就需要进行云函数跨云开发调用。
  • 微信小程序连接MySQL数据库

    万次阅读 多人点赞 2020-10-27 18:15:18
    承接上一个商品列表页,在服务器端连接MySQL数据库,通过条件匹配查寻数据并显示在客户端 准备工作 1、node.js 2、微信开发者工具 3、MySQL数据库 MySQL配置数据库、数据表 通过可视化的Workbench,可以很容易的...
  • 程序使用的是云数据库,开发完成后要做一个web端的后台系统 使用Web SDK 可以调用小程序的云函数,实现对数据库的增删改查等操作
  • 数据库发展和展望二、使用C语言实现一个简单的数据库三、使用C语言连接数据库四、SQL语言和MySQL教程1.SQL是什么1) DDL - Data Definition Language,数据定义语言2) DML - Data Manipulation Language,数据处理...
  • 微信小程序怎么读取...一般情况下,小程序的utils这文件夹下,我们可以把本地的数据写进去,封装成.js文件,提供对外暴露的接口,然后读取本地数据。如果涉及到一些针对这些数据的处理方法,也可以把方法写好...
  • 一个多线程,每3秒钟执行次,执行查询数据,数据是集合list形式,然后在线程体力循环遍历list,再根据遍历的list数据再查询另外一张表a数据插入到表b中,list集合数据不确定是多少条,这样的程序怎么设计或使用...
  • Cobar分布式关系数据库访问代理

    千次阅读 2020-10-24 08:41:58
    Cobar是阿里巴巴开源的一个分布式关系数据库访问代理,介于应用服务器和数据库服务器之间(Cobar也支持非独立部署,以lib的方式和应用程序部署在一起)。应用程序通过JDBC驱动访问Cobar集群,Cobar服务器根据SQL和分...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 989,487
精华内容 395,794
热门标签
关键字:

多个程序访问同一个数据库