我不清楚如何通过上下文在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:
我已经找遍了,但我不清楚对此的最佳实践是什么。想法?
我补充这个答案是为了澄清我之前的评论,也是为了将来这个问题的访问者。
总结
以下两种方法都将使用DB连接池:
type=“javax.sql.DataSource”
一起使用
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创建了太多的连接。这在最初误导了我)。
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对象中声明常量感觉很尴尬。 问题答案: 您可以使用将其显式导出到全局范围。然后,您只需要提供文件,甚至不保存您的返回值。 但实际上,您不应该这样做。保持适当封装是一件好事。您已经有了正确的想法,因此请继续做您正在做的事情。