Oracle>Java代码中获取连接 配置工作完成后,最后一步就是在Java代码中通过JNDI查找来获取数据库连接,这会在Servlet、DAO(Data Access Object)层或一个专门的工具类中完成。
以下是一个在Servlet中获取并使用数据库连接的示例:
import javax.naming.InitialContext;import javax.naming.NamingException;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.sql.DataSource;import java.io.IOException;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;@WebServlet("/testConnection")public class TestConnectionServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {Connection conn = null;PreparedStatement ps = null;ResultSet rs = null;try {// 1. 获取JNDI初始上下文InitialContext ctx = new InitialContext();// 2. 查找数据源// "java:comp/env" 是JNDI的标准环境命名上下文前缀DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/MyOracleDS");// 3. 从数据源获取连接conn = ds.getConnection();// 4. 执行数据库操作ps = conn.prepareStatement("SELECT 'Hello from Oracle!' AS message FROM DUAL");rs = ps.executequery();if (rs.next()) {response.getWriter().println("数据库连接成功!消息: " + rs.getString("message"));}} catch (NamingException e) {response.getWriter().println("JNDI查找失败: " + e.getMessage());e.printStackTrace();} catch (SQLException e) {response.getWriter().println("SQL执行失败: " + e.getMessage());e.printStackTrace();} finally {// 5. 关闭资源,将连接返还给连接池// 使用try-with-resources语句可以更优雅地处理资源关闭if (rs != null) { try { rs.close(); } catch (SQLException e) {} }if (ps != null) { try { ps.close(); } catch (SQLException e) {} }if (conn != null) { try { conn.close(); } catch (SQLException e) {} }}}}注意:在块中关闭
Connection、PreparedStatement和是至关重要的,调用conn.close()并非真正关闭物理连接,而是将其“归还”给连接池,供其他请求复用,忘记关闭连接是导致连接泄漏最常见的原因。连接池参数详解与优化
合理设置连接池参数是发挥其最大效能的关键。
相关问答FAQs
Q1: Tomcat自带的连接池与其他第三方连接池(如HikariCP、Druid)相比有何优劣?
Tomcat自带的连接池(Tomcat JDBC Pool)是基于Apache Commons DBCP优化而来的,性能和稳定性都相当不错,并且与Tomcat容器无缝集成,配置简单,无需引入额外的依赖库,对于大多数中小型应用,它已经完全足够,像HikariCP这样的“零开销”高性能连接池,在极端高并发场景下通常能提供更低的延迟和更高的吞吐量,被誉为目前最快的JDBC连接池,Druid则以其强大的监控功能著称,如果你的应用对数据库连接性能有极致要求,或者需要非常详细的监控统计,可以考虑替换为HikariCP或Druid,替换方式通常是移除Tomcat默认的连接池配置,将第三方连接池的JAR包放入目录,并修改的属性为对应的实现类。
Q2: 如何判断我的连接池配置是否合理,或者是否存在连接泄漏?
判断连接池配置和诊断连接泄漏可以从以下几个方面入手:
JNDI访问数据库的方式?
1、在tomcat6\conf\文件的Context节点中增加下面节点:
[solr配置问题]我按照网上说的方法去配置,可是TOMCAT启动,就是访问不了SOLR欢迎页面。
把solr-4.x.x/example/lib/ext/*拷贝到tomcat/lib里然后重新启动tomcat
数据库密码里特殊字符@,配连接池怎样处理
问题解决思路:将配置文件用户相关的信息(例如:密码)进行加密使其以密文形式存在,进行初始化连接池的时候进行解密操作,达到成功创建连接池的目的。 Tomcat默认使用DBCP连接池(基于common-pool的一种连接池实现),可在下载commons-dbcp源码包,对类修改,把数据库密码字段(加密后的密文)用解密程序解密,获得解密后的明文即可。 具体实现:1. 修改类文件找到数据源密码设置部分value = (PROP_PASSWORD);if (value != null) {(value); }修改为:value = (PROP_PASSWORD);if (value != null) {((value));}将配置文件中的“密码”(加密后的结果)取出,调用加解密类中的解密方法(value)进行解密。 2.加密类,本例中使用加密解密模块比较简单只是用来说明问题,密文为明文的十六进制串。 public class Encode {//编码-普通字符串转为十六进制字符串 public static String encode(String password){String result = “”;byte[] psd = ();for(int i=0;iresult += (psd[i]&0xff); } return result; } //解码–十六进制字符串转为普通字符串 public static String decode(String password){ String result = “”; password = (); int length = () / 2; char[] hexChars = (); byte[] d = new byte[length]; for (int i = 0; i < length; i++) { int pos = i * 2; d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1])); } result = new String(d); return result; } //字符转字节 public static byte charToByte(char c) { return (byte) “ABCDEF”(c); } } 3. 数据库连接池文件,红色字体为数据源配置中密码设置,此时已经改为密文形式。 password 696e url jdbc:oracle:thin:@127.0.0.1:1521:orcl driverClassName username wanfang 4. 将修改后的和新添加的编译后的class类文件重新打包进,将该包拷贝进tomcat下的common/lib目录中,重启tomcat。 此时tomcat下部署的应用在连接数据源的时候都可以在不暴露密码明文的情况下进行连接。















发表评论