从java.sql.Connection创建线程安全的MyBatis会话

从java.sql.Connection创建线程安全的MyBatis会话,java,sql,jdbc,mybatis,snowflake-cloud-data-platform,Java,Sql,Jdbc,Mybatis,Snowflake Cloud Data Platform,我正在尝试将MyBatis与雪花数据库一起使用。我的情况与这张海报相似: 从本质上讲,我可以获得java.sql.Connection对象,但我不能通过数据源或通常由RDBMS数据库(如Oracle)完成的其他步骤来获得它。一个建议的解决方案是做如下事情 这: 它们将位于多线程环境中。如果有人关闭snowflakeSession对象,是否会关闭底层java.sql.Connection对象?我计划重新使用这些会话,但只在一个线程内使用。这有必要吗 对于Oracle,我可以这样做:

我正在尝试将MyBatis与雪花数据库一起使用。我的情况与这张海报相似:

从本质上讲,我可以获得java.sql.Connection对象,但我不能通过数据源或通常由RDBMS数据库(如Oracle)完成的其他步骤来获得它。一个建议的解决方案是做如下事情 这:

它们将位于多线程环境中。如果有人关闭snowflakeSession对象,是否会关闭底层java.sql.Connection对象?我计划重新使用这些会话,但只在一个线程内使用。这有必要吗

对于Oracle,我可以这样做:

        OracleDataSource result = new OracleDataSource();
        Class.forName("oracle.jdbc.driver.OracleDriver");
        String connectionString = jdbcUrl;
        String username = jdbcUserName; 
        String password = jdbcPassword;
        OracleDataSource oracleDataSource = (OracleDataSource)result; 
        oracleDataSource.setURL(connectionString);
        oracleDataSource.setPassword(password);
        oracleDataSource.setUser(username);
        String timeoutKey = "oracle.jdbc.ReadTimeout";
        Properties connectionProperties;
        try {
            connectionProperties = oracleDataSource.getConnectionProperties();
            if(connectionProperties==null) {
                connectionProperties = new Properties();
            }
            connectionProperties.put(timeoutKey, 60 /* minutes */ * 60 /* seconds per minutes */ * 1000 /* ms per seconds */);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return result;

如果我可以创建一个SnowflakeDataSource对象,我就可以像创建Oracle一样轻松地创建连接。我必须小心如何创建连接,因为这也是MyBatis扫描XML映射器文件的同一点,或者重复使用它从以前的连接请求中已经找到的内容。

它没有出现,但Snowflake的JDBC驱动程序包确实提供了一个可以在
数据源::getConnection()时完全获取的连接
称为:

import net.snowflake.client.jdbc.snowflake.source;
SnowflakeBasicDataSource ds=新的SnowflakeBasicDataSource();
ds.setUrl(“jdbc:snowflake://account.region.snowflakecomputing.com/");
ds.setUser(“用户”);
设置密码(“密码”);
ds.setWarehouse(“wh”);
ds.setDatabaseName(“db”);
ds.设置模式(“模式”);
ds.setRole(“角色”);
//可以传递其他任意连接或会话属性
//通过上面ds.setUrl(…)调用中的URL参数
//使用ds.setOauthToken(…)
//或ds.setAuthenticator(…)
//或ds.setPrivateKey(…)
//或ds.setPrivateKeyFile(…)
//用于替代身份验证模式
连接conn=ds.getConnection();

为什么不能使用
数据源?如果您可以创建JDBC连接,那么您可以使用
数据源
(或实现您自己的)。@markrottveel我正在编辑我的问题,以展示我对Oracle的方法,对于雪花,我找不到这种方法。您不需要使用特定于雪花的
数据源
,您可以使用(例如)HikariCP,并获得连接池。
        OracleDataSource result = new OracleDataSource();
        Class.forName("oracle.jdbc.driver.OracleDriver");
        String connectionString = jdbcUrl;
        String username = jdbcUserName; 
        String password = jdbcPassword;
        OracleDataSource oracleDataSource = (OracleDataSource)result; 
        oracleDataSource.setURL(connectionString);
        oracleDataSource.setPassword(password);
        oracleDataSource.setUser(username);
        String timeoutKey = "oracle.jdbc.ReadTimeout";
        Properties connectionProperties;
        try {
            connectionProperties = oracleDataSource.getConnectionProperties();
            if(connectionProperties==null) {
                connectionProperties = new Properties();
            }
            connectionProperties.put(timeoutKey, 60 /* minutes */ * 60 /* seconds per minutes */ * 1000 /* ms per seconds */);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return result;