实现JNDI数据源
JNDI数据源
使用了池化的技术:提高程序执行效率和降低系统资源开销。
使用容器管理的数据源,如EJB或应用服务器,它只有俩个属性配置:
initial_context: 从InitialContext中查找Context
data_source:数据源实例的context路径
String jndiName = ….;
Context context = new InitialContext();
DataSource ds = (DataSource)context.lookup(jndiName);
示例:
新建web项目,部署在Tomcat8.0上
Tomcat8.0内置了dbcp数据库连接池
在web项目的META-INF下,新建context.xml:
- 步骤一:web环境,添加框架的支持
- 步骤二:在MATE-INF中编写context.xml
![](https://i-blog.csdnimg.cn/blog_migrate/7c9c05c6f69f0f446ee5a04c3a4778b3.png)
![](https://i-blog.csdnimg.cn/blog_migrate/afd44def8bed4f095f7c7cfc0b7bf762.png)
![](https://i-blog.csdnimg.cn/blog_migrate/34c4274fc54ec94b61b03fc18978e6a4.png)
<?xml version="1.0" encoding="UTF-8"?> <Context path="/"> <Resource name="jdbc/StaffJndi" auth="Container" type="javax.sql.DataSource" username="root" password="ROOT" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/staff" maxActive="100" maxIdle="30" maxWait="10000"/> </Context> |
Web.Xml中配置resource
<!-- 配置jndi的resource的信息 --> <resource-ref> <description>new DataSource</description> <res-ref-name>jdbc/StaffJndi</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> |
<environment id="development3"> <transactionManager type="JDBC"/> <dataSource type="JNDI"> <property name="data_source" value="java:comp/env/jdbc/StaffJndi"/> </dataSource> </environment> |
创建一个servlet,运行在web环境下。
在servlet中测试数据源:
@WebServlet(name = "TestServlet",urlPatterns = {"/test"}) public class TestServlet extends javax.servlet.http.HttpServlet { protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException { try { //创建上下文 InitialContext initialContext = new InitialContext(); //在上下文中引用数据源 DataSource dataSource = (DataSource) initialContext.lookup("java:comp/env/jdbc/StaffJndi"); System.out.println(dataSource); //获取连接 Connection connection = dataSource.getConnection(); System.out.println(connection); } catch (NamingException | SQLException e) { e.printStackTrace(); } } |
执行结果: org.apache.tomcat.dbcp.dbcp2.BasicDataSource@5f50f29e 135115990, URL=jdbc:mysql://localhost:3306/mydb?serverTimezone=UTC, UserName=root@localhost, MySQL Connector/J |
默认使用JndiDataSourceFactory创建DataSource
![](https://i-blog.csdnimg.cn/blog_migrate/3958134a90272b6d06a89c5108431777.png)
JDBC和JNDI的区别?
JNDI不单单是用来连接数据库的,它是通过命名服务来找到数据库并返回数据库连接,当然JNDI还可以管理当前应用服务器上的其他资源,如网页,文件等,它用来连接数据库时和JDBC最大的区别就是它是通过应用服务器配置(如Tomcat)的配置文件context.xml来找数据库驱动的,其次就是JDBC连接能承受的同时请求数太低了,JNDI连接池连接与之相比会好很多。