簡體   English   中英

從 java.sql.Connection 創建線程安全的 MyBatis 會話

[英]Creating thread safe MyBatis sessions from a java.sql.Connection

我正在嘗試將 MyBatis 與 Snowflake 數據庫一起使用。 我的情況和這張海報類似:

配置mybatis使用已有的連接

Essentially, I can get a java.sql.Connection Object, but I cannot get that by way of a DataSource, or other steps normally done by RDBMS databases like Oracle. 一種建議的解決方案是執行以下操作:

SqlSession snowflakeSession = snowflakeSqlSessionFactory.openSession(getSnowflakeConnection());

這些將在多線程環境中。 如果有人關閉了 snowflakeSession object,那是否會關閉底層 java.sql.Connection ZA8CFDE63311BD59EB2AC96B8F 我計划重復使用這些會話,但只在一個線程內。 這是必要的嗎?

對於 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 object,我可以像創建 Oracle 一樣輕松地創建連接。 我必須小心如何創建連接,因為這也是 MyBatis 掃描 XML 映射器文件的同一點,或者重新使用它已經從以前的連接請求中找到的內容。

它似乎沒有記錄,但雪花的 JDBC 驅動程序 package 確實提供了一個基本的數據源 class可以獲取全新的連接對象,當 Data:Source DataSource::getConnection()

import net.snowflake.client.jdbc.SnowflakeBasicDataSource;

SnowflakeBasicDataSource ds = new SnowflakeBasicDataSource();

ds.setUrl("jdbc:snowflake://account.region.snowflakecomputing.com/");

ds.setUser("user");
ds.setPassword("password");
ds.setWarehouse("wh");
ds.setDatabaseName("db");
ds.setSchema("schema");
ds.setRole("role");

// Other arbitrary connection or session properties can be passed
// via URL params in the ds.setUrl(...) call above

// Use ds.setOauthToken(...)
// or  ds.setAuthenticator(...)
// or  ds.setPrivateKey(...)
// or  ds.setPrivateKeyFile(...)
// for alternative modes of authentication

Connection conn = ds.getConnection();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM