当前位置: 首页 > 知识库问答 >
问题:

如何在Tomcat中共享Oracle连接?

欧阳山
2023-03-14

我不清楚如何通过上下文在Tomcat中建立与Oracle RAC数据库的连接。xml。这种方法对我很有效:

<Resource
     name="jdbc/mydb"
     auth="Container"
     type="javax.sql.DataSource"
     driverClassName="oracle.jdbc.OracleDriver"
     url="jdbc:oracle:thin:<connection details>"
     username="<username>"
     password="<account>"
     maxTotal="150"
     maxIdle="10"
     />

但这是使用连接池吗?我尝试添加工厂="org.apache.tomcat.jdbc.pool.DataSourceFactory",正如https://tomcat.apache.org/tomcat-8.0-doc/jdbc-pool.html建议的那样,神秘的是,随着这一变化,我开始得到:

java.sql.SQLException: ORA-01017: invalid username/password; logon denied

如果我尝试类型=oracle.jdbc.pool.OracleDataSource和工厂=oracle.jdbc.pool.OracleDataSourceFactory我得到:

Error: Unable to obtain a JDBC connection from Datasource:
java.lang.Exception: Error: Unable to obtain a JDBC connection from Datasource:

我已经找遍了,但我不清楚对此的最佳实践是什么。想法?

共有2个答案

司徒泰
2023-03-14

我补充这个答案是为了澄清我之前的评论,也是为了将来这个问题的访问者。

总结

以下两种方法都将使用DB连接池:

  • 将Tomcat较新的默认DBCP 2池与type=“javax.sql.DataSource”一起使用
  • 将Tomcat的旧JDBC池与factory=“org.apache.Tomcat.JDBC.pool.DataSourceFactory”和type=“org.apache.Tomcat.JDBC.pool.DataSource”一起使用

我不知道足够的差异给任何强有力的建议。使用一个比另一个。

默认DBCP 2 Tomcat池

要通过JNDI资源使用默认的Tomcat DB连接池,您应该遵循这个Tomcat文档页面上提供的说明:JNDI数据源如何

具体来说,您需要使用type=“javax.sql.DataSource”

这里有一个非常基本的资源配置——不适合生产,但对说明方法很有用。这是MySQL而不是Oracle,所以需要做一些调整:

<Resource name="jdbc/my_db" 
          auth="Container" 
          type="javax.sql.DataSource"
          initialSize="5"
          username="db_user"
          password="***"
          driverClassName="com.mysql.cj.jdbc.Driver"
          url="jdbc:mysql://localhost:3306/mytestdb" />

使用initialSize=“5”时,我在DB服务器上看到了5个预期的连接。

在JVM中,创建了一个连接池-如此VisualVM堆转储中所示:

在这里,我们可以看到创建了这个池,它有5个连接对象,并且使用的是Tomcat DBCP——这反过来又是apachecommonsDBCP 2的一个分支。

DBCP2提供了对JDBC4.1的支持。

Tomcat自主开发的JDBC池

如果您查看另一页上的Tomcat文档—Tomcat JDBC连接池—您将看到不同的指导。

具体来说,它声明您在

factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
type="org.apache.tomcat.jdbc.pool.DataSource"

如果使用此选项,您还将使用DB连接池-但它将基于旧的Tomcat JDBC池包:

在本例中,我使用了initialSize=“3”

在Tomcat留档中,这表示为一个新的连接池(它是以前使用的Commons DBCP 1. x的替换)。它不像Tomcat默认DBCP 2解决方案那么新。我认为留档的措辞已经过时了。因此有些混乱。

附加注释

来自Tomcat提交团队成员的注释(请参阅此处):

Tomcat JDBC是Tomcat的"本地"数据库连池,不使用poolPREared语句

Tomcat DBCP是Tomcat的包,重命名为Apache Commons DBCP 2的fork。

默认情况下使用Tomcat DBCP。

您总是可以选择直接在代码中实现池,而不使用JNDI

(在我最初的测试中,我的Tomcat安装出现了一个问题,导致为DBCP 2创建了太多的连接。这在最初误导了我)。

郭思淼
2023-03-14

Oracle通用连接池(UCP)是您也可以使用的Java连接池。它功能丰富,与Oracle RAC、DG等配合良好。,看看UCPServlet的例子。

 类似资料:
  • 问题内容: 我是Go菜鸟,无法找到在Go中打开mysql连接然后在http处理程序之间共享它的完整示例。到目前为止,这是我的代码,如何使用在HomeHandler中的main()中打开的db连接? 问题答案: 数据库/ sql程序包会自动为您管理连接池。 返回 代表连接池 而不是单个连接的句柄。如果池中的所有连接都忙,则数据库/ sql软件包会自动打开一个新连接。 将其应用于代码意味着,您只需要共

  • 我创建了一个mvc控制器来处理用户的登录请求。 在控制器中,我需要完成一些与数据库相关的任务,每个任务将访问一个由spring自动连线的mybatis映射器的服务对象,这将创建一个mybatis sqlsession并使用它和关闭它。 我的问题是,我们能让所有这些任务共享同一个mybatis sqlsession吗? 那么如何让多个映射器共享一个SqlSessionTemplate呢?

  • 问题内容: 我收集到有两种方法可以在Windows中(在Windows上)连接到Oracle DB: github.com/tgulacsi/goracle github.com/mattn/go-oci8 但是对于我这个级别的人(开源+ golang的初学者)来说,这两种方法/驱动程序非常棘手。 在不同的机器上进行部署,开发等工作时,这也是一个负担(也假设它会工作)。 有没有更好的方法可以在go

  • 问题内容: 有什么方法可以从Java代码中调用库中的函数吗?通常,可以在Java程序中使用Linux 库吗? 问题答案: 答案是“ JNI” :) 这里有几个链接: 如何在Linux上为JNI应用程序编译动态库? http://learn-from-the-guru.blogspot.com/2007/12/java-native-interface-jni-tutorial-hell.html

  • 问题内容: 这是推特的一些代码和平…我想知道如何像在iOS堆栈照片应用程序中一样获得共享操作视图… 问题答案:

  • 问题内容: 目前,我正在这样做: foo.js 并在中使用它: 有一个更好的方法吗?在exports对象中声明常量感觉很尴尬。 问题答案: 您可以使用将其显式导出到全局范围。然后,您只需要提供文件,甚至不保存您的返回值。 但实际上,您不应该这样做。保持适当封装是一件好事。您已经有了正确的想法,因此请继续做您正在做的事情。