HikariCP-如何在代码中引发连接问题错误

时间:2019-03-05 17:15:05

标签: scala hikaricp scalikejdbc

下面的代码尝试使用scalikejdbc和hikari连接池从MSSQL服务器获取批处理数据,然后为每个resultSet调用一个函数map

def fetchAndMap(query: String, map: WrappedResultSet => Unit) = {
      NamedDB(db.connectionName) readOnly {
  implicit session =>
      SQL(query)
        .fetchSize(10000)
        .foreach(map)

def map(rs:WrappedResultSet) = {
  // do some process
 }

此外,我的连接池配置如下:

val myDb: DataSource = {
val hikariConfig = new HikariConfig()
hikariConfig.setJdbcUrl(url)
hikariConfig.setUsername(username)
hikariConfig.setPassword(password)
hikariConfig.setMaximumPoolSize(3)
hikariConfig.setDriverClassName(driver)
val db = new HikariDataSource(hikariConfig)
db
}

ConnectionPool.singleton(new DataSourceConnectionPool(mydb))
val connectionName = config.getString(name)
ConnectionPool.add(connectionName, new DataSourceConnectionPool(myDb))

问题是由于网络断开而导致与db的连接中断。在这种情况下,我无法自行处理异常。另外,我启用了调试日志记录,发现hikari抛出此异常:

[HikariPool-5 connection adder] DEBUG com.zaxxer.hikari.pool.PoolBase 
- HikariPool-5 - Failed to create/setup connection: Connection reset 
ClientConnectionId:06724082-8ad9-4769-ab98-96bde324b2db
[HikariPool-5 connection adder] DEBUG 
com.zaxxer.hikari.pool.HikariPool - HikariPool-5 - Cannot acquire connection from data source
com.microsoft.sqlserver.jdbc.SQLServerException: Connection reset 
ClientConnectionId:06724082-8ad9-4769-ab98-96bde324b2db
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.terminate(SQLServerConnec tion.java:2826)
at com.microsoft.sqlserver.jdbc.TDSChannel.read(IOBuffer.java:1979)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.Prelogin(SQLServerConnection.java:2537)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:2387)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:2042)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectInternal(SQLServerConnection.java:1889)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:1120)
at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:700)
at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:117)
at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:123)
at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:365)
at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:194)
at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:460)
at com.zaxxer.hikari.pool.HikariPool.access$100(HikariPool.java:71)
at com.zaxxer.hikari.pool.HikariPool$PoolEntryCreator.call(HikariPool.java:697)
at com.zaxxer.hikari.pool.HikariPool$PoolEntryCreator.call(HikariPool.java:683)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
    Caused by: java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(SocketInputStream.java:210)
    at java.net.SocketInputStream.read(SocketInputStream.java:141)
    at 
    com.microsoft.sqlserver.jdbc.TDSChannel.read(IOBuffer.java:1971)

有什么办法可以在代码中获取此异常,以便我控制结果?

0 个答案:

没有答案