我正在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)
- 纯古Java(http://tomcat.apache.org/tomcat-8.5-doc/jdbc-pool.html#Plain_Ol'_Java((出于遗留原因,首选(
由于我关心连接的性能,我将使用连接池。我的问题是:
两种方法在性能方面是否相同
我只是想知道使用上下文,tomcat是否能更好地管理池,特别是当有多场战争使用它时
在代码中而不是在JNDI中配置数据源有几个缺点:
-
您引入了代码对
tomcat-jdbc
和该库的特定版本的依赖关系。这意味着,您的应用程序只能在Tomcat的特定版本上运行。 -
您失去了应用程序之间连接池的优势:如果以编程方式创建数据源,则每个应用程序都将拥有自己的连接池。另一方面,通过使用JNDI,您可以决定是为每个应用程序创建一个数据源,还是共享一个全局数据源(请参阅Context与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>