【问题标题】:Java Oracle connection falls downJava Oracle 连接断开
【发布时间】:2015-05-13 18:06:07
【问题描述】:

我正在实施学校项目。我们必须在 Java EE 和 Oracle 中创建自己的 ORM。我已经尝试过两种数据库连接方式:

  1. DriverManager.getConnection(DSN, USER, PASSWORD);
  2. 上下文 initContext = new InitialContext();
    上下文 envContext = (Context)initContext.lookup("java:comp/env");
    this.dataSource = (DataSource)envContext.lookup("jdbc/isets");

对我来说,一种方法比另一种方法效果更差。我有一个实体(表格行),这个实体有一个包含另一个实体列表的属性。当我尝试打印这些实体时,有时看起来数据库连接断开了,因为某些实体没有加载。几乎每次没有打印出来的时候,有时一切都很好(无法预测哪些不会打印出来或者什么时候可以)。

当我使用第一种连接方法时,它适用于很少的数据库查询。如果我尝试从数据库中选择 10 个对象(在 10 个查询中),则会显示 Oracle 服务器的异常。另一方面,当我使用第二种方法时,会出现更多问题。第一个是几乎每次我运行应用程序时,它都会无限加载(至少 10 分钟)。有时它会正确加载,但根据第一种方法,更多的“子实体”无法正确加载。

我想使用连接池,但我不知道问题可能出在哪里。我关注了这个"HOW TO",但它不想工作:-(。

这是我的 context.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" path="/ISETS-TOMCAT">
    <Resource name="jdbc/isets"
        auth="Container"
        type="javax.sql.DataSource"

        testWhileIdle="true"
        testOnBorrow="true"
        testOnReturn="false"
        validationQuery="SELECT 1 FROM DUAL"

        maxActive="15"
        maxIdle="5"
        maxWait="-1"

        removeAbandoned="true"
        removeAbandonedTimeout="60"
        logAbandoned="true"

        driverClassName="oracle.jdbc.OracleDriver"
        url="jdbc:oracle:thin:@localhost:1521:XE"
        username="SYSTEM"
        password="admin"

        defaultTransactionIsolation="SERIALIZABLE"  />
</Context>

这是我的 web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
         http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
  <servlet>
    <servlet-name>Controller</servlet-name>
    <servlet-class>isets.controllers.Controller</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Controller</servlet-name>
    <url-pattern>/Controller</url-pattern>
  </servlet-mapping>
  <session-config>
    <session-timeout>60</session-timeout>
  </session-config>
  <resource-ref>
    <description>ISETS Oracle pool</description>
    <res-ref-name>jdbc/isets</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
  </resource-ref>
</web-app>

这是建立连接的代码:

Context initContext = new InitialContext();
Context envContext  = (Context)initContext.lookup("java:comp/env");

dataSource = (DataSource)envContext.lookup("jdbc/isets");

connection = dataSource.getConnection();
connection.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);

我做错了吗?你能帮忙吗?谢谢,再见。

【问题讨论】:

  • 您的 context.xml 和 web.xml 以及您的代码看起来都很好(乍一看!)也许您可以向我们展示您的实体内部的连接管理?
  • 另外,请向我们展示您遇到的异常情况。
  • 您是否正在耗尽资源(例如存在最大数量的游标),因为您在使用它们后没有关闭结果集并正确释放连接,也许?显示你得到的异常会很有帮助。
  • 这里是异常消息:Listener denied the connection with the following error: ORA-12519, TNS:no proper service handler found
  • 那么是的,这就是你正在做的事情。您需要检查所有代码以查找连接泄漏...

标签: java oracle tomcat jdbc


【解决方案1】:

因为您正在使用 Connection.TRANSACTION_SERIALIZABLE 从一个连接进行的更改可能在另一个连接中不可见。我会尝试删除此设置。

【讨论】:

  • 删除 SERIALIZABLE 级别的隔离不起作用,不幸的是这是项目的要求,但谢谢。
  • 有什么异常?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-27
  • 2011-01-02
相关资源
最近更新 更多