我有一个java服务器,它使用quartz作为调度器连续运行作业。这个程序的目标是周期性地执行计算,因此每t分钟就有一个作业开始:它获取数据进行验证,进行一些计算并将其保存回数据库。
服务器是从microsoft azure中的vm和Ubuntu12.04 lts运行的,而数据库是sql azure。我使用的orm是ebean3.3.1-rc2。
我不断得到以下例外:
javax.persistence.PersistenceException: com.microsoft.sqlserver.jdbc.SQLServerException: The connection is closed.
at com.avaje.ebeaninternal.server.transaction.JdbcTransaction.rollback(JdbcTransaction.java:642)
at com.avaje.ebeaninternal.server.transaction.JdbcTransaction.rollback(JdbcTransaction.java:623)
at com.avaje.ebeaninternal.server.core.BeanRequest.rollbackTransIfRequired(BeanRequest.java:87)
at com.avaje.ebeaninternal.server.core.DefaultServer.findId(DefaultServer.java:1241)
at com.avaje.ebeaninternal.server.core.DefaultServer.findUnique(DefaultServer.java:1253)
at com.avaje.ebeaninternal.server.querydefn.DefaultOrmQuery.findUnique(DefaultOrmQuery.java:908)
at com.avaje.ebeaninternal.util.DefaultExpressionList.findUnique(DefaultExpressionList.java:189)
at com.db.DAO.findById(ItemDAO.java:89)
at com.jobs.Task.doTask(ItemTask.java:50)
at com.jobs.Job.execute(ItemJob.java:34)
at org.quartz.core.JobRunShell.run(JobRunShell.java:213)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:557)
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: The connection is closed.
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:190)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.checkClosed(SQLServerConnection.java:388)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.rollback(SQLServerConnection.java:1954)
at com.avaje.ebeaninternal.server.lib.sql.PooledConnection.rollback(PooledConnection.java:794)
at com.avaje.ebeaninternal.server.transaction.JdbcTransaction.rollback(JdbcTransaction.java:635)
... 11 more
这是我的ebean.conf:
datasource.azuresql.username=username
datasource.azuresql.password=password
datasource.azuresql.databaseUrl=jdbc:sqlserver://server_name.database.windows.net:1433;database=database_name;user=user_name@server_name;password=password;encrypt=true;hostNameInCertificate=*.database.windows.net;loginTimeout=30;
datasource.azuresql.databaseDriver=com.microsoft.sqlserver.jdbc.SQLServerDriver
datasource.azuresql.minConnections=1
datasource.azuresql.maxConnections=400
datasource.azuresql.isolationlevel=read_committed
datasource.azuresql.capturestacktrace=true
datasource.azuresql.maxInactiveTimeSecs=30
我不知道该怎么办,我试图改变超时值,最小/最大连接数,但这个异常不断弹出。我注意到的一件事是,系统运行良好一段时间,然后我得到大约30-40个像这样的异常,然后一切都继续,因为没有任何问题。
请建议一个解决方案,谢谢。
1条答案
按热度按时间tgabmvqs1#
正如上面的一条评论所说,peter的连接池将帮助您获得一个已经打开的连接。这就是它的主要功能。连接池还可以帮助您自动删除已关闭的连接;但是连接池可能很难处理断开的连接。在.net世界中,请查看这篇解释需要对.net库进行更新才能处理此特定情况的博客文章。如果ebean没有在内部实现一个类似的逻辑,它会自动为您重新打开一个断开的连接,那么实现它的负担就在您身上。
此外,添加针对azuresql数据库的连接重试是一种已知且强烈建议的模式。下面是一个旧的博客,展示了这种模式的早期实现。这里是微软最近的一个最佳实践文档。