我有一个Java服务器,它使用Quartz作为调度程序连续运行作业。 该程序的目标是定期执行计算,因此每个T分钟开始一个作业:它获取数据以进行验证,进行一些计算并将其保存回数据库。
服务器使用Ubuntu 12.04 LTS从Microsoft Azure中的VM运行,而数据库是SQL Azure。 我正在使用的ORM是Ebean 3.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个异常,就像这个一样,然后一切都继续,因为没有错。
请建议修复,谢谢。
答案 0 :(得分:1)
正如上面其中一条评论所述,来自Peter,连接池将帮助您获得已打开的连接。这是它的主要功能。连接池还可以通过自动删除已关闭的连接来帮助您;但连接池可能很难处理断开的连接。在.NET世界中,查看this blog post,它解释了需要对.NET库进行更新才能处理这种特定情况。如果Ebean没有在内部实现类似的逻辑,会自动为您重新打开断开的连接,那么您需要负担实现它。
此外,添加针对Azure SQL数据库的连接重试是一种已知且强烈推荐的模式。这里是an older blog,显示了此模式的早期实现。这是微软最新的best practice document。