我一直在四处寻找并收集了一些零散的信息,如果这个问题已经在其他地方得到了回答,但我找不到它,我深表歉意。
我正在使用 Tomcat 使用 Java 编写 Web 应用程序,并在后端使用 SQL Azure。
有多个 Servlet 访问 SQL Azure 数据库。我想使用 Tomcat 8.5 管理的连接池
我的META-INF中的应用程序context.xml如下:
<Context>
<Resource name="jdbc/sqlazure"
auth="Container"
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
type="javax.sql.DataSource"
maxIdle="30"
username="[username]"
password="[password]"
url="jdbc:sqlserver://[database]:1433;database=BackInfo;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30"
removeAbandonedTimeout="30"
logAbandoned="true" />
</Context>
在Java代码中,我访问的典型方式是:
InitialContext ic = new InitialContext();ds = (DataSource)ic.lookup("java:comp/env/jdbc/sqlazure");
尝试(连接 con = ds.getConnection())....
一切似乎都正常,所以让我在这里确认我的理解:
我不需要指定单独的 web.xml,因为我使用的是 Tomcat 8.5。正确吗?
当我以这种方式连接时,Azure 将自动创建一个池。池中的连接数等无法(不需要?)配置。
在我意识到我还有其他需要访问数据库的 servlet 之前,我有一个 servlet 直接通过 SQLServerConnectionPoolDataSource 创建数据源并从那里获取连接。文档指出:
SQLServerConnectionPoolDataSource is typically used in Java Application Server environments that support built-in connection pooling and require a ConnectionPoolDataSource to provide physical connections, such as Java Platform, Enterprise Edition (Java EE) application servers that provide JDBC 3.0 API spec connection pooling.
这是否意味着当我直接使用 SQLServerConnectionPoolDataSource 请求连接时,它会检查 Tomcat 是否支持池,然后基本上使用 JDBC 机制创建由 Tomcat 管理的 SQL Azure 连接池?
通过 Tomcat JNDI 查找获取数据源时,使用 context.xml 中指定的 SQLServerDriver。当Web应用程序启动时,它将检查context.xml并使用SQLServerDriver连接到SQL Azure,检查是否支持池,如果支持则Tomcat正在使用驱动程序自动创建它返回的连接池数据源?
我还想到了另一个问题。让 Singleton DataSource 类返回对池连接 DataSource 的引用是否有意义,或者让每个 servlet 在其 init() 中查找数据源并将其存储在私有(private)变量中会更好吗?
<
谢谢
最佳答案
根据我的理解,SQL Server的jdbc连接池是由Java应用程序创建的,而不是Azure创建的。我的建议是你需要引用下面的Tomcat官方文档来了解JNDI Resources & JDBC DataSource。
关于java - SQL Azure 和连接池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41133552/