Jpa 内部异常:java.sql.SQLException:状态无效,连接对象已关闭
我有一个使用Eclipse持久性服务的JSF应用程序-2.1.1.v20100817-r8050,有时会出现以下错误:Jpa 内部异常:java.sql.SQLException:状态无效,连接对象已关闭,jpa,eclipselink,Jpa,Eclipselink,我有一个使用Eclipse持久性服务的JSF应用程序-2.1.1.v20100817-r8050,有时会出现以下错误: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.1.1.v20100817-r8050): org.eclipse.persistence.exceptions.DatabaseException Internal Exception: java.sql.SQLException: Invali
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.1.1.v20100817-r8050): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: Invalid state, the Connection object is closed.
Error Code: 0
Call: SELECT XXXXX FROM XXXXX
bind => [/Home/Footer/]
Query: ReadAllQuery(name="WWW.find" referenceClass=WWW sql="SELECT XXXXX FROM XXXXX")
我不知道是什么引起的。以下函数在“return q.getResultList();”行中抛出异常
公共列表查找(字符串url){
}
EntityManager em=getEntityManager();
试一试{
Query q=em.createNamedQuery(“WWW.find”);
q、 setParameter(“url”,url);
返回q.getResultList();
}最后{
em.close();
}
}
我们有SQL Server 2005,但数据库没有关闭。这是最近不断发生的事情。下面是我们在persistence.xml文件中设置的属性。对这方面的变化有何评论
<properties>
<property name="javax.persistence.jdbc.password" value="password"/>
<property name="javax.persistence.jdbc.user" value="user"/>
<property name="javax.persistence.jdbc.driver" value="net.sourceforge.jtds.jdbc.Driver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:jtds:sqlserver://SERVER:1433/DB"/>
<property name="eclipselink.ddl-generation" value="none"/>
<property name="eclipselink.jdbc.timeout" value="20"/>
<property name="eclipselink.jdbc.connections.wait-timeout" value="20"/>
<property name="javax.persistence.query.timeout" value="20"/>
<property name="eclipselink.allow-zero-id" value="true"/>
</properties>
这是我的课
公共类WWWJPA控制器{
public WWWWJpaController() {
emf = Persistence.createEntityManagerFactory("properties");
}
public WWWWJpaController(String unitName) {
emf = Persistence.createEntityManagerFactory(unitName);
}
private EntityManagerFactory emf = null;
public EntityManager getEntityManager() {
return emf.createEntityManager();
}
public List<WWW> find(String url) {
EntityManager em = getEntityManager();
try {
Query q = em.createNamedQuery("WWW.find");
q.setParameter("url", url);
return q.getResultList();
}finally{
em.close();
}
}
}
public wwjpacontroller(){
emf=Persistence.createEntityManagerFactory(“属性”);
}
公共WWJPA控制器(字符串unitName){
emf=Persistence.createEntityManagerFactory(unitName);
}
私有EntityManagerFactory emf=null;
公共实体管理器getEntityManager(){
返回emf.createEntityManager();
}
公共列表查找(字符串url){
EntityManager em=getEntityManager();
试一试{
Query q=em.createNamedQuery(“WWW.find”);
q、 setParameter(“url”,url);
返回q.getResultList();
}最后{
em.close();
}
}
}
我猜您的数据库连接已超时,或者您的数据库已关闭。
您可能需要重试查询,或重新连接会话
您是如何配置连接池的?您使用的是什么数据库?可能您的应用程序服务器无法重新连接到数据库,正如BalusC在其评论中指出的,每次备份完成时都会发生这种情况
您可以按照显示
getEntityManager()
中的说明重新连接服务器。顺便说一句:为什么不使用@PersistenceContext
?这样,您就不必自己创建/关闭它。添加了my getEntityManager()。您是否有使用@PersistenceContext的示例链接?“我以前从未用过这个。”巴卢斯。我刚刚发现,在备份服务器时会出现这些问题。我们在虚拟服务器上运行,备份该服务器时,它将进入“保存模式”。这会有任何影响吗?如果这个问题仅仅是因为连接的另一端在连接仍在使用时突然关闭了连接而导致的,这是很有可能的。您需要调查备份期间发生这种情况的原因。是出于某种原因重新启动服务器和/或其连接池吗?在周末没有运行备份时,错误再次发生。因此,我认为这排除了备份问题的可能。您能推荐一些代码,在执行select之前检查连接吗。如果连接不存在,请重新连接。
public WWWWJpaController() {
emf = Persistence.createEntityManagerFactory("properties");
}
public WWWWJpaController(String unitName) {
emf = Persistence.createEntityManagerFactory(unitName);
}
private EntityManagerFactory emf = null;
public EntityManager getEntityManager() {
return emf.createEntityManager();
}
public List<WWW> find(String url) {
EntityManager em = getEntityManager();
try {
Query q = em.createNamedQuery("WWW.find");
q.setParameter("url", url);
return q.getResultList();
}finally{
em.close();
}
}
}