前提情要:
培训的时候都没讲过,也是书上看到过这么个东西,进公司干外包的第二个项目就用了这个鬼东西
自学也不是没尝试过实现,结果各种失败,还找不到问题所在,索性不写了
JNDI实现参考:
目前参考这篇博客是有效且成功的:
https://www.cnblogs.com/zhchoutai/p/7389089.html
存在的环境问题(踩过的烂坑):
1、Tomcat版本只能在8版本以下
2、MySQL驱动Jar包 只允许在5版本以下 (目前公司用的5.1版本,可能往上5.7版本也不支持了)
3、关于JNDI配置描述的正确方法(配置文件存放位置众说纷纭。。。)
实现操作:
Tomcat官方文档有描述说是有自带数据源连接池
但是没驱动,道理就是Tomcat也不知道你要连上什么厂商的数据库,Oracle? MySQL? SqlServer?
所以这东西你得自己弄
在Tomcat的Lib目录下放上这个驱动包
D:\Server\apache-tomcat-8.5.69\lib\mysql-connector-java-5.1.35.jar
然后配置连接描述:
<?xml version="1.0" encoding="UTF-8"?> <!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> <!-- The contents of this file will be loaded for each web application --> <Context> <!-- Default set of monitored resources. If one of these changes, the --> <!-- web application will be reloaded. --> <WatchedResource>WEB-INF/web.xml</WatchedResource> <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource> <!-- Uncomment this to disable session persistence across Tomcat restarts --> <!-- <Manager pathname="" /> --> <Resource name="jndiTesting" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="root" password="TencentCloud@mysql5.7.18-dzz!1376" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://cdb-6cmot19i.cd.tencentcdb.com:10000/jmcwechat_cyc"/> </Context>
注意 name,auth 这两个东西不能搞错
这个文件的位置在:
D:\Server\apache-tomcat-8.5.69\conf\context.xml
然后用IDEA随便搭建一个JavaWeb项目,就是普通项目,都不需要Maven构建的那种
在web.xml里面配置JNDI信息
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <resource-ref> <description>DB Connection</description> <res-ref-name>jndiTesting</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> </web-app>
文件位置(在项目里面可以找到):
C:\Users\Administrator\IdeaProjects\JndiTesting\web\WEB-INF\web.xml
检查是否连接成功:
在首页index.jsp编写 连接的嵌入代码
<%-- Created by IntelliJ IDEA. User: Administrator Date: 2021/7/19 Time: 18:48 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ page import="java.sql.*,javax.sql.*,javax.naming.*" %> <html> <head> <title>$Title$</title> </head> <body> $END$ <% Connection conn = null; try { //初始化查找命名空间 Context ctx = new InitialContext(); //InitialContext ctx = new InitialContext();亦可 //找到DataSource,对名称进行定位java:comp/env是必须加的,后面跟你的DataSource名 DataSource ds = (DataSource)ctx.lookup("java:comp/env/jndiTesting"); //取出连接 conn = ds.getConnection(); System.out.println("connection pool connected !!"); } catch (NamingException e) { System.out.println(e.getMessage()); } catch (SQLException e) { e.printStackTrace(); }finally { //注意不是关闭,是放回连接池. conn.close(); } %> </body> </html>
开启项目后,控制台成功打印:
D:\Server\apache-tomcat-8.5.69\bin\catalina.bat run [2021-07-19 06:54:32,504] Artifact JndiTesting:war exploded: Waiting for server connection to start artifact deployment... Using CATALINA_BASE: "C:\Users\Administrator\AppData\Local\JetBrains\IntelliJIdea2021.1\tomcat\05f72586-ccf4-4015-b51e-2d50f0d989f2" Using CATALINA_HOME: "D:\Server\apache-tomcat-8.5.69" Using CATALINA_TMPDIR: "D:\Server\apache-tomcat-8.5.69\temp" Using JRE_HOME: "C:\Program Files\Java\jdk1.8.0_291" Using CLASSPATH: "D:\Server\apache-tomcat-8.5.69\bin\bootstrap.jar;D:\Server\apache-tomcat-8.5.69\bin\tomcat-juli.jar" Using CATALINA_OPTS: "" 19-Jul-2021 18:54:33.185 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log Server.鏈嶅姟鍣ㄧ増鏈�: Apache Tomcat/8.5.69 19-Jul-2021 18:54:33.186 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log 鏈嶅姟鍣ㄦ瀯寤�: Jun 30 2021 18:00:00 UTC 19-Jul-2021 18:54:33.186 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log 鏈嶅姟鍣ㄧ増鏈彿: 8.5.69.0 19-Jul-2021 18:54:33.186 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log 鎿嶄綔绯荤粺鍚嶇О: Windows 10 19-Jul-2021 18:54:33.186 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log OS.鐗堟湰: 10.0 19-Jul-2021 18:54:33.186 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log 鏋舵瀯: amd64 19-Jul-2021 18:54:33.186 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log Java 鐜鍙橀噺: C:\Program Files\Java\jdk1.8.0_291\jre 19-Jul-2021 18:54:33.186 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log Java铏氭嫙鏈虹増鏈�: 1.8.0_291-b10 19-Jul-2021 18:54:33.186 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log JVM.渚涘簲鍟�: Oracle Corporation 19-Jul-2021 18:54:33.186 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE: C:\Users\Administrator\AppData\Local\JetBrains\IntelliJIdea2021.1\tomcat\05f72586-ccf4-4015-b51e-2d50f0d989f2 19-Jul-2021 18:54:33.187 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME: D:\Server\apache-tomcat-8.5.69 19-Jul-2021 18:54:33.187 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log 鍛戒护琛屽弬鏁帮細 -Djava.util.logging.config.file=C:\Users\Administrator\AppData\Local\JetBrains\IntelliJIdea2021.1\tomcat\05f72586-ccf4-4015-b51e-2d50f0d989f2\conf\logging.properties 19-Jul-2021 18:54:33.187 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log 鍛戒护琛屽弬鏁帮細 -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager 19-Jul-2021 18:54:33.187 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log 鍛戒护琛屽弬鏁帮細 -Dcom.sun.management.jmxremote= 19-Jul-2021 18:54:33.187 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log 鍛戒护琛屽弬鏁帮細 -Dcom.sun.management.jmxremote.port=1099 19-Jul-2021 18:54:33.187 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log 鍛戒护琛屽弬鏁帮細 -Dcom.sun.management.jmxremote.ssl=false 19-Jul-2021 18:54:33.187 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log 鍛戒护琛屽弬鏁帮細 -Dcom.sun.management.jmxremote.password.file=C:\Users\Administrator\AppData\Local\JetBrains\IntelliJIdea2021.1\tomcat\05f72586-ccf4-4015-b51e-2d50f0d989f2\jmxremote.password 19-Jul-2021 18:54:33.187 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log 鍛戒护琛屽弬鏁帮細 -Dcom.sun.management.jmxremote.access.file=C:\Users\Administrator\AppData\Local\JetBrains\IntelliJIdea2021.1\tomcat\05f72586-ccf4-4015-b51e-2d50f0d989f2\jmxremote.access 19-Jul-2021 18:54:33.187 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log 鍛戒护琛屽弬鏁帮細 -Djava.rmi.server.hostname=127.0.0.1 19-Jul-2021 18:54:33.187 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log 鍛戒护琛屽弬鏁帮細 -Djdk.tls.ephemeralDHKeySize=2048 19-Jul-2021 18:54:33.187 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log 鍛戒护琛屽弬鏁帮細 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources 19-Jul-2021 18:54:33.187 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log 鍛戒护琛屽弬鏁帮細 -Dignore.endorsed.dirs= 19-Jul-2021 18:54:33.187 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log 鍛戒护琛屽弬鏁帮細 -Dcatalina.base=C:\Users\Administrator\AppData\Local\JetBrains\IntelliJIdea2021.1\tomcat\05f72586-ccf4-4015-b51e-2d50f0d989f2 19-Jul-2021 18:54:33.187 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log 鍛戒护琛屽弬鏁帮細 -Dcatalina.home=D:\Server\apache-tomcat-8.5.69 19-Jul-2021 18:54:33.187 淇℃伅 [main] org.apache.catalina.startup.VersionLoggerListener.log 鍛戒护琛屽弬鏁帮細 -Djava.io.tmpdir=D:\Server\apache-tomcat-8.5.69\temp 19-Jul-2021 18:54:33.187 淇℃伅 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent 浣跨敤APR鐗堟湰[1.7.0]鍔犺浇浜嗗熀浜嶢PR鐨凙pache Tomcat鏈満搴揫1.2.30]銆� 19-Jul-2021 18:54:33.187 淇℃伅 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR鍔熻兘锛欼Pv6[true]銆乻endfile[true]銆乤ccept filters[false]銆乺andom[true]銆� 19-Jul-2021 18:54:33.188 淇℃伅 [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR/OpenSSL閰嶇疆锛歶seAprConnector[false]锛寀seOpenSSL[true] 19-Jul-2021 18:54:33.190 淇℃伅 [main] org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL鎴愬姛鍒濆鍖� [OpenSSL 1.1.1k 25 Mar 2021] 19-Jul-2021 18:54:33.276 淇℃伅 [main] org.apache.coyote.AbstractProtocol.init 鍒濆鍖栧崗璁鐞嗗櫒 ["http-nio-8080"] 19-Jul-2021 18:54:33.286 淇℃伅 [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared selector for servlet write/read 19-Jul-2021 18:54:33.295 淇℃伅 [main] org.apache.catalina.startup.Catalina.load Initialization processed in 315 ms 19-Jul-2021 18:54:33.318 淇℃伅 [main] org.apache.catalina.core.StandardService.startInternal 姝e湪鍚姩鏈嶅姟[Catalina] 19-Jul-2021 18:54:33.318 淇℃伅 [main] org.apache.catalina.core.StandardEngine.startInternal 姝e湪鍚姩 Servlet 寮曟搸锛歔Apache Tomcat/8.5.69] 19-Jul-2021 18:54:33.323 淇℃伅 [main] org.apache.coyote.AbstractProtocol.start 寮�濮嬪崗璁鐞嗗彞鏌刐"http-nio-8080"] 19-Jul-2021 18:54:33.330 淇℃伅 [main] org.apache.catalina.startup.Catalina.start Server startup in 34 ms Connected to server [2021-07-19 06:54:33,546] Artifact JndiTesting:war exploded: Artifact is being deployed, please wait... 19-Jul-2021 18:54:33.656 璀﹀憡 [RMI TCP Connection(3)-127.0.0.1] org.apache.tomcat.util.descriptor.web.WebXml.setVersion 鏈煡鐗堟湰瀛楃涓� [4.0]銆傚皢浣跨敤榛樿鐗堟湰銆� 19-Jul-2021 18:54:33.809 璀﹀憡 [RMI TCP Connection(3)-127.0.0.1] org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory.getObjectInstance Name = jndiTesting Property maxActive is not used in DBCP2, use maxTotal instead. maxTotal default value is 8. You have set value of "100" for "maxActive" property, which is being ignored. 19-Jul-2021 18:54:33.809 璀﹀憡 [RMI TCP Connection(3)-127.0.0.1] org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory.getObjectInstance Name = jndiTesting Property maxWait is not used in DBCP2 , use maxWaitMillis instead. maxWaitMillis default value is -1. You have set value of "10000" for "maxWait" property, which is being ignored. 19-Jul-2021 18:54:33.828 淇℃伅 [RMI TCP Connection(3)-127.0.0.1] org.apache.jasper.servlet.TldScanner.scanJars 鑷冲皯鏈変竴涓狫AR琚壂鎻忕敤浜嶵LD浣嗗皻鏈寘鍚玊LD銆� 涓烘璁板綍鍣ㄥ惎鐢ㄨ皟璇曟棩蹇楄褰曪紝浠ヨ幏鍙栧凡鎵弿浣嗘湭鍦ㄥ叾涓壘鍒癟LD鐨勫畬鏁碕AR鍒楄〃銆� 鍦ㄦ壂鎻忔湡闂磋烦杩囦笉闇�瑕佺殑JAR鍙互缂╃煭鍚姩鏃堕棿鍜孞SP缂栬瘧鏃堕棿銆� [2021-07-19 06:54:33,856] Artifact JndiTesting:war exploded: Artifact is deployed successfully [2021-07-19 06:54:33,856] Artifact JndiTesting:war exploded: Deploy took 310 milliseconds connection pool connected !! connection pool connected !! connection pool connected !! 19-Jul-2021 18:54:43.329 淇℃伅 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory 鎶妛eb 搴旂敤绋嬪簭閮ㄧ讲鍒扮洰褰� [D:\Server\apache-tomcat-8.5.69\webapps\manager] 19-Jul-2021 18:54:43.402 璀﹀憡 [localhost-startStop-1] org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory.getObjectInstance Name = jndiTesting Property maxActive is not used in DBCP2, use maxTotal instead. maxTotal default value is 8. You have set value of "100" for "maxActive" property, which is being ignored. 19-Jul-2021 18:54:43.402 璀﹀憡 [localhost-startStop-1] org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory.getObjectInstance Name = jndiTesting Property maxWait is not used in DBCP2 , use maxWaitMillis instead. maxWaitMillis default value is -1. You have set value of "10000" for "maxWait" property, which is being ignored. 19-Jul-2021 18:54:43.404 淇℃伅 [localhost-startStop-1] org.apache.jasper.servlet.TldScanner.scanJars 鑷冲皯鏈変竴涓狫AR琚壂鎻忕敤浜嶵LD浣嗗皻鏈寘鍚玊LD銆� 涓烘璁板綍鍣ㄥ惎鐢ㄨ皟璇曟棩蹇楄褰曪紝浠ヨ幏鍙栧凡鎵弿浣嗘湭鍦ㄥ叾涓壘鍒癟LD鐨勫畬鏁碕AR鍒楄〃銆� 鍦ㄦ壂鎻忔湡闂磋烦杩囦笉闇�瑕佺殑JAR鍙互缂╃煭鍚姩鏃堕棿鍜孞SP缂栬瘧鏃堕棿銆� 19-Jul-2021 18:54:43.409 淇℃伅 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Web搴旂敤绋嬪簭鐩綍[D:\Server\apache-tomcat-8.5.69\webapps\manager]鐨勯儴缃插凡鍦╗79]姣鍐呭畬鎴�
题外话:
这是简单的基础JNDI连接方式
在项目里面Spring框架还做了JNDI的支持