主要问题是在一个大型/大型java项目中,多个类具有多个数据库连接,
我们是否应该使用全局单连接到数据库并运行它直到程序结束并在程序结束时关闭它 我们应该在需要时使用多个数据库连接吗? 这在安全性,易于访问方面更好。
答案 0 :(得分:0)
在"大"我将使用应用程序容器来管理数据库连接。 安全性不仅取决于与数据库的连接。对我而言,这有点过头了。如果设计存在缺陷,安全性始终是一个问题,例如: SQL注入。
答案 1 :(得分:0)
我们是否应该使用全局单连接到数据库并运行它直到 程序结束并在程序结束时关闭它?
一般情况下,在程序结束之前,不应该为整个应用程序使用单个连接,这是一种不好的做法。
我们是否应该在需要时使用多个数据库连接?**
是的,您需要使用多个连接并在任务完成后释放每个连接对象,即,始终关闭finally
块中的资源或使用 try-with-resources ,以便他们不会造成任何连接泄漏。
数据库连接创建成本高昂,在企业应用程序中,您需要选择连接池,它会在启动期间加载特定数量的连接,您将使用&返回池中的连接。您可以在此处查看here。
答案 2 :(得分:0)
最好将连接管理移交给Tomcat JDBC Pool.
等连接池从官方文件中获取的优势列表,
通过其他连接池实现添加的功能
1.支持高度并发环境和多核/ cpu系统。
2.界面的动态实现,将为您的运行时环境支持java.sql和javax.sql接口(只要你的 即使使用较低版本的编译,JDBC驱动程序也会这样做 JDK。
3.验证间隔 - 我们不必每次都使用连接验证,我们可以在借用或返回时执行此操作 连接,只是不比我们可以配置的间隔更频繁。
4. 运行一次查询,这是一个可配置的查询,只有在建立与数据库的连接时才会运行一次。非常有用 设置会话设置,您希望在整个时间内存在 建立了联系。
5.配置自定义拦截器的功能。这允许您编写自定义拦截器以增强功能。您可以使用 拦截器收集查询统计信息,缓存会话状态,重新连接 失败时的连接,重试查询,缓存查询结果和 等等。你的选择是无止境的,拦截器是动态的,而不是 绑定到java.sql / javax.sql接口的JDK版本。
6. 高性能 - 我们稍后会在
上显示一些性能差异7.极其简单,由于实现非常简化,行数和源文件数非常低,与c3p0比较 有超过200个源文件(我们上次检查过),Tomcat jdbc有一个 8个文件的核心,连接池本身大约是一半。如 可能会出现错误,它们会更快地跟踪,并且更容易修复。 复杂性降低一直是人们关注的重点。
8. 异步连接检索 - 您可以对连接请求进行排队并接收Future。
9.Better 空闲连接处理。它不是直接关闭连接,而是仍然可以将空闲池与连接进行池连接并调整大小 更智能的算法。
10.您可以在什么时候决定连接被视为放弃,是在池已满时,还是直接在超时时通过指定 池使用率阈值。
11. 放弃连接计时器将在语句/查询活动时重置。允许长时间使用的连接不允许 超时。这是使用ResetAbandonedTimer
实现的12. 关闭连接在连接一段时间后。年龄基于返回游泳池时关闭。
13.当怀疑连接被放弃时,获取 JMX通知并记录条目。这类似于 removeAbandonedTimeout但它不采取任何行动,只报告 信息。这是使用suspectTimeout属性实现的。
14.可以从java.sql.Driver,javax.sql.DataSource或javax.sql.XADataSource中检索连接。这是使用 dataSource和dataSourceJNDI属性。
15.XA连接支持
<强>示例:强>
以下是有关如何为JNDI查找配置资源的示例。
<Resource name="jdbc/TestDB"
auth="Container"
type="javax.sql.DataSource"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
testWhileIdle="true"
testOnBorrow="true"
testOnReturn="false"
validationQuery="SELECT 1"
validationInterval="30000"
timeBetweenEvictionRunsMillis="30000"
maxActive="100"
minIdle="10"
maxWait="10000"
initialSize="10"
removeAbandonedTimeout="60"
removeAbandoned="true"
logAbandoned="true"
minEvictableIdleTimeMillis="30000"
jmxEnabled="true"
jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;
org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"
username="root"
password="password"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/mysql"/>