先介绍一下局部数据源配置的共同之处是:
需要在webapp应用文件夹下的/WEB-INF下的context.xml中配置,有的人是没有这个文件夹的,需要自己手动生成(没错就是我,全班都在用eclipse而我用idea发现自己并没有,可能是因为我创建的是maven工程是自己导入的webapp):
导入后如上图。
这里再穿插一下context.xml和web.xml:
【方式1】传统的jdbc连接:
不需要在context.xml中配置。但是需要类加载驱动以及driverManager管理并获得数据库的连接。(后文的DataSource就是用来取代DriverManager驱动管理器的)
//mysql8以后的版本都是这个,以前的版本是com.mysql.jdbc.Driver
String driver = "com.mysql.cj.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/assign?useSSL=false&serverTimeZone=UTC";
String username = "root";
String password = "1234";
try {
Class.forName(driver);
connection = DriverManager.getConnection(url,username,password);
} catch (ClassNotFoundException e) {
System.out.println(e);
// getServletConfig().log("驱动程序类找不到!");
} catch (SQLException e) {
System.out.println(e);
}
【方式2】用jdbc配置数据源(DataSource):(经常失败)
局部数据源配置需要在context.xml中声明,但不需要在web.xml中配置:
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/" reloadable="true">
<Resource
name="jdbc/webstoreDS"
type="javax.sql.DataSource"
maxTotal="4"
maxIdle="2"
driverClassName="com.mysql.cj.jdbc.Driver"
url="jdbc:mysql://localhost:3306/assign?useSSL=false"
username="root"
password="1234"
maxWaitMillis="5000"/>
</Context>
【方式3】用c3p0配置数据源(ComboPooledDataSource)
注意:配置c3p0的context.xml的Resource标签中的一些属性名可能跟jdbc中的不同!!!
比如:driverClassName变成driverClass,url变成jdbcUrl,username变成user等...
name属性可以任意取,是用于在初始化时寻找对应的context.xml中声明的数据源,以连接数据库。type取决于你配置数据源的类型,像c3p0就是com.mchange.v2.c3p0.ComboPooledDataSource,jdbc就是javax.sql.DataSource。而且还需要factory="org.apache.naming.factory.BeanFactory"。
<?xml version="1.0" encoding="UTF-8"?>
<Context reloadable = "true">
<Resource
name="c3p0"
type="com.mchange.v2.c3p0.ComboPooledDataSource"
factory="org.apache.naming.factory.BeanFactory"
auth="Container"
driverClass="com.mysql.cj.jdbc.Driver"
jdbcUrl="jdbc:mysql://localhost:3306/assign?useSSL=false"
user="root"
password="1234"/>
</Context>
JNDI(Java Naming and Directory Interface,Java命名和目录接口)是一种标准的Java命名系统接口,在java代码中配置如下:
DataSource dataSource = null;
Connection connection = null;
InitialContext context = new InitialContext();
dataSource = (DataSource) context.lookup("java:comp/env/(context中配置的资源的name)");
connection = dataSource.getConnection();