Ниже код пытается получить пакетные данные с MSSQL-сервера, используя scalikejdbc и пул соединений hikari, затем для каждого из 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))
Проблема в том, что соединение с БД прервано из-за отключения сети. В этом случае я не могу обработать исключениев одиночку.Кроме того, я включил ведение журнала отладки и обнаружил, что 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)
Есть ли способ получить это исключение внутри кода, чтобы я мог контролировать результат?