【问题标题】:Hikari connection pool issue with sybasesybase 的 Hikari 连接池问题
【发布时间】:2019-10-15 16:16:21
【问题描述】:

我有一个 java spring boot 应用程序,它使用 Spring JDBC 驱动程序向 sybase 批量插入数据。我正在使用 Sybase JDBC 驱动程序并使用 DriverManagerDataSource 和 HikariConnectionPool 进行批量插入。数据源创建正常,但是当我尝试创建 HikariConnectionPool 时,它给出错误连接关闭错误。下面是代码。如您所见,我正在执行显式调用以查看连接是否已关闭并且它返回 false。我无法理解我在这里缺少什么。 TIA 的任何建议。

源代码

@Configuration
@Profile("local")
public class SpringJDBCLocalConfiguration {

    Logger logger = LoggerFactory.getLogger(SpringJDBCLocalConfiguration.class);


    @Bean(name = "dataSource")
    public DataSource dataSource() {


        DriverManagerDataSource dataSource = new DriverManagerDataSource(){{
            setDriverClassName("com.sybase.jdbc4.jdbc.SybDriver");
            setUrl("url");
            setUsername("username");
            setPassword("passwd");         
        }};;

        try {
            Connection conn = dataSource.getConnection();
            logger.info("SpringJDBCLocalConfiguration conn "+conn);
            logger.info("SpringJDBCLocalConfiguration conn isClosed "+conn.isClosed());

        }
        catch(Exception exc){
            logger.error("SpringJDBCLocalConfiguration error getting connection in SpringJDBCLocalConfiguration "+exc);
        }

        HikariConfig config = new HikariConfig() {{
            setDataSource(dataSource);
            setConnectionTestQuery("SELECT 1");
        }};

        HikariDataSource hikariDataSource = new HikariDataSource(config);
        return hikariDataSource;
    }


    @Bean
    public JdbcTemplate jdbcTemplate(@Qualifier("dataSource") DataSource dataSource) {

        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource());        
        return jdbcTemplate;
    }
}   

错误堆栈跟踪

[ main] c.j.a.w.e.d.SpringJDBCLocalConfiguration : inside SpringJDBCLocalConfiguration.dataSource method flushStrategy
[ main] com.zaxxer.hikari.HikariConfig : sybase-pool - idleTimeout is close to or more than maxLifetime, disabling it.
[ main] com.zaxxer.hikari.HikariDataSource : sybase-pool - Starting...
[ main] com.zaxxer.hikari.pool.PoolBase : sybase-pool - Driver does not support get/set network timeout for connections. (com.sybase.jdbc4.jdbc.SybConnection.getNetworkTimeout()I)
[ main] com.zaxxer.hikari.pool.HikariPool : sybase-pool - Exception during pool initialization.
 java.sql.SQLException: JZ0C0: Connection is already closed.
 at com.sybase.jdbc4.jdbc.ErrorMessage.raiseError(ErrorMessage.java:779) ~[jconn4-7.07-27307.jar!/:na]
 at com.sybase.jdbc4.jdbc.SybConnection.checkConnection(SybConnection.java:4010) ~[jconn4-7.07-27307.jar!/:na]
 at com.sybase.jdbc4.jdbc.SybStatement.close(SybStatement.java:744) ~[jconn4-7.07-27307.jar!/:na]
 at com.sybase.jdbc4.jdbc.SybStatement.close(SybStatement.java:719) ~[jconn4-7.07-27307.jar!/:na]
 at com.sybase.jdbc4.jdbc.MdaManager.loadMetaData(MdaManager.java:573) ~[jconn4-7.07-27307.jar!/:na]
 at com.sybase.jdbc4.jdbc.MdaManager.<init>(MdaManager.java:188) ~[jconn4-7.07-27307.jar!/:na]
 at com.sybase.jdbc4.jdbc.MdaManager.<init>(MdaManager.java:171) ~[jconn4-7.07-27307.jar!/:na]
 at com.sybase.jdbc4.jdbc.SybConnection.checkMDA(SybConnection.java:4155) ~[jconn4-7.07-27307.jar!/:na]
 at com.sybase.jdbc4.jdbc.SybConnection.getMDA(SybConnection.java:3685) ~[jconn4-7.07-27307.jar!/:na]
 at com.sybase.jdbc4.tds.Tds.setOption(Tds.java:1829) ~[jconn4-7.07-27307.jar!/:na]
 at com.sybase.jdbc4.jdbc.SybConnection.setReadOnly(SybConnection.java:2586) ~[jconn4-7.07-27307.jar!/:na]
 at com.zaxxer.hikari.pool.PoolBase.setupConnection(PoolBase.java:409) ~[HikariCP-2.7.9.jar!/:na]
 at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:370) ~[HikariCP-2.7.9.jar!/:na]
 at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:194) ~[HikariCP-2.7.9.jar!/:na]
 at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:460) [HikariCP-2.7.9.jar!/:na]
 at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:534) [HikariCP-2.7.9.jar!/:na]
 at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115) [HikariCP-2.7.9.jar!/:na]
 at com.zaxxer.hikari.HikariDataSource.<init>(HikariDataSource.java:81) [HikariCP-2.7.9.jar!/:na]

【问题讨论】:

    标签: spring spring-boot sybase spring-jdbc hikaricp


    【解决方案1】:

    问题是应用程序在云中运行并且能够建立数据库连接,但似乎防火墙杀死了连接,因此在创建连接池时没有找到活动连接导致此错误。我尝试将 ip 地址和端口显式列入白名单,但仍然是同样的问题,但根本原因是防火墙阻止了连接。

    【讨论】:

    • HikariCP 和 jconnect 驱动也有同样的问题。尝试了不同版本的 jconn4.jar 没有成功。看起来数据库或防火墙断开了连接,但在双方(客户端和服务器)都停止了防火墙 - 再次出现问题
    猜你喜欢
    • 2021-10-05
    • 2022-07-24
    • 2018-01-06
    • 1970-01-01
    • 2023-02-10
    • 1970-01-01
    • 2021-11-08
    • 2018-10-05
    • 1970-01-01
    相关资源
    最近更新 更多