• gitbase jdbc 连接简单说明


    以下是Hikari 连接gitbase 的一个简单说明,可以参考,同时附带解决问题的思路

    • 参考代码
      spring bean
     
    @Bean
    public DataSource dataSource(){
        HikariConfig config = new HikariConfig();
        config.setDriverClassName("com.mysql.cj.jdbc.Driver");
        config.setJdbcUrl("jdbc:mysql://<host>:3306/gitbase?useLocalSessionState=true&characterEncoding=UTF-8");
        config.setUsername("<username>");
        config.setPassword("<password>");
        HikariDataSource hikariDataSource = new HikariDataSource(config);
        return hikariDataSource;
    }
    • 问题说明
      如果使用默认的参数jdbc:mysql://<host>:3306/gitbase?characterEncoding=UTF-8 
      出现的问题如下
     
    Caused by: java.sql.SQLException: Could not retrieve transaction isolation level from server
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129) ~[mysql-connector-java-8.0.17.jar:8.0.17]
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) ~[mysql-connector-java-8.0.17.jar:8.0.17]
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89) ~[mysql-connector-java-8.0.17.jar:8.0.17]
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63) ~[mysql-connector-java-8.0.17.jar:8.0.17]
        at com.mysql.cj.jdbc.ConnectionImpl.getTransactionIsolation(ConnectionImpl.java:1214) ~[mysql-connector-java-8.0.17.jar:8.0.17]
        at com.zaxxer.hikari.pool.PoolBase.checkDefaultIsolation(PoolBase.java:479) ~[HikariCP-3.4.5.jar:na]
        at com.zaxxer.hikari.pool.PoolBase.checkDriverSupport(PoolBase.java:442) ~[HikariCP-3.4.5.jar:na]
        at com.zaxxer.hikari.pool.PoolBase.setupConnection(PoolBase.java:410) ~[HikariCP-3.4.5.jar:na]
        at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:363) ~[HikariCP-3.4.5.jar:na]
        at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206) ~[HikariCP-3.4.5.jar:na]
        at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:477) ~[HikariCP-3.4.5.jar:na]
        at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:560) ~[HikariCP-3.4.5.jar:na]

    跟进源码发现hikari 走了prepareCall,gitbase是不支持此特性的,而且gitbase 是不支持事务的,我们应该关闭此选项
    hikari PoolBase.java 调用处理

     
    private void checkDriverSupport(final Connection connection) throws SQLException
    {
      if (!isValidChecked) {
         checkValidationSupport(connection);
         checkDefaultIsolation(connection);
     
         isValidChecked = true;
      }
    }

    加载mysql jdbc 源码之后发现了此方法
    ConnectionImpl.java 文件

     
    @Override
    public int getTransactionIsolation() throws SQLException {
     
        synchronized (getConnectionMutex()) {
            // 此配置是核心
            if (!this.useLocalSessionState.getValue()) {
                String s = this.session.queryServerVariable(
                        versionMeetsMinimum(8, 0, 3) || (versionMeetsMinimum(5, 7, 20) && !versionMeetsMinimum(8, 0, 0)) ? "@@session.transaction_isolation"
                                : "@@session.tx_isolation");
     
                if (s != null) {
                    Integer intTI = mapTransIsolationNameToValue.get(s);
                    if (intTI != null) {
                        this.isolationLevel = intTI.intValue();
                        return this.isolationLevel;
                    }
                    throw SQLError.createSQLException(Messages.getString("Connection.12", new Object[] { s }), MysqlErrorNumbers.SQL_STATE_GENERAL_ERROR,
                            getExceptionInterceptor());
                }
                throw SQLError.createSQLException(Messages.getString("Connection.13"), MysqlErrorNumbers.SQL_STATE_GENERAL_ERROR, getExceptionInterceptor());
            }
     
            return this.isolationLevel;
        }
    }

    解决方法就很简单了,如果设置为true问题就可以解决了,因为默认为空

    public ConnectionImpl(HostInfo hostInfo) throws SQLException {
     
            try {
                // Stash away for later, used to clone this connection for Statement.cancel and Statement.setQueryTimeout().
                ....
                this.useLocalSessionState = this.propertySet.getBooleanProperty(PropertyKey.useLocalSessionState);
                this.useServerPrepStmts = this.propertySet.getBooleanProperty(PropertyKey.useServerPrepStmts);

    说明

    以上只是一个思路,代码部分处理可能不同版本会不同,注意选择

    参考资料

    https://github.com/brettwooldridge/HikariCP

  • 相关阅读:
    C#实现任意源组播与特定源组播
    张灵甫此人性格偏激,赌性重,喜欢冒险,做事不留后路,更适合担任中下层军官(要自己掌控着自己的命运)
    Delphi 中 断言 Assert 用法
    桌面程序阻止Windows关机(使用Message.Result取得DefWindowProc API函数的返回值,非常重要)
    Asp.net vnext的IIS部署
    Asp.net vNext 学习3
    EasyUI的后台界面
    C#框架
    前端分离规范
    AngularJS html5Mode与ASP.NET MVC路由
  • 原文地址:https://www.cnblogs.com/rongfengliang/p/15906522.html
Copyright © 2020-2023  润新知