问题描述
我正在处理在 Tomcat 8.5.40 上运行的 war,使用 jdk 8.261 编译,我需要使用 ojdb8-19.3.0.0 驱动程序连接到 Oracle。将有更多的战争连接到同一个数据库。
AFAIK 并在文档中发现,实现连接有两种主要方式:
- 上下文/资源/JNDI (https://tomcat.apache.org/tomcat-8.5-doc/jndi-datasource-examples-howto.html)
- Plain Old Java (http://tomcat.apache.org/tomcat-8.5-doc/jdbc-pool.html#Plain_Ol'_Java)(出于遗留原因首选)
由于我担心连接的性能,我将使用连接池。 我的问题是:
两种方法在性能方面是否相同?
我只是想知道如果使用上下文,tomcat 可以更好地管理池,特别是当有多个战争使用它时。
解决方法
在代码中而不是 JNDI 中配置数据源有几个缺点:
-
您的代码依赖于
tomcat-jdbc
和此库的特定版本。这意味着,您的应用程序只能在特定版本的 Tomcat 上运行。 -
您失去了应用程序之间连接池的优势:如果以编程方式创建数据源,每个应用程序都将拥有自己的连接池。另一方面,通过使用 JNDI,您可以决定是为每个应用程序创建一个数据源还是共享一个全局数据源(请参阅 Context versus GlobalNamingResources)。
如果您使用全局数据源,则池中的空闲连接对所有应用程序都可用,因此打开与数据库的新 TCP/IP 连接的需要较少发生(建立新 TCP/IP 连接的时间成本)是毫秒量级的,所以比较高)。
GlobalNamingResources 示例
在 server.xml
中配置数据源:
<GlobalNamingResources>
<Resource auth="Container"
type="javax.sql.DataSource"
name="jdbc/globalDb"
username="username"
password="secret"
url="jdbc:..." />
...
</GlobalNamingResources>
将 <ResourceLink>
添加到您的上下文文件:
<Context>
<ResourceLink name="jdbc/db"
global="jdbc/globalDb"
type="javax.sql.DataSource" />
...
</Context>