Tomcat提供了三种利用JNDI方式配置数据源的形式:
1、应用程序中的context.xml,这也是最简单的一种方式,我们只需要在你自己的应用程序下的META-INF文件夹里建立一个context.xml文件,我们需要定义Resource这个元素,这样容器会自动加载及配置它。这种方法很简单,但也有一些弊端:
·即使我们的配置有很小的变化,对于程序来说你都需要重复打包部署。
·datasource只能被自己那个应用程序使用,不能作为全局datasource被很多不同的应用来共同使用。
·如果有个全局的datasource (server.xml)被定义,那么应用程序中的datasource 将会被覆盖。
2、Server context.xml 如果你有多个应用程序 ,而你又想让他们共用DataSource,我们就可以在apache-tomcat/conf下的context.xml,他的作用域为全局应用程序的。所以如果你定义了连接池有100个连接的话,加入你有20个应用程序 ,那么如果这20个应用程序都走这个连接的话,就会创建出2000个连接,每个应用都会有100个连接。这样会明显影响数据库服务器资源及应用程序性能。
3、server.xml and context.xml我们可以定义一个全局的来代替在server.xml GlobalNamingResources
element中定义的形式。如果我们用这种方式,就绪要在服务器的context.xml定义ResourceLink元素,或者是应用程序指定的地方。这是最好的一种解决多应用程序共享连接池的方式。
下面的代码是在tomcat的server.xml里配置的,并且需要被添加到GlobalNamingResources 元素内。所以首先要确保你的数据库驱动程序要在tomcat的lib文件夹下。之所以必须放到这里面,是因为类的加载机制所决定的。详细内容请了解一下类的加载机制来理解。下面是用mysql的形式连接。
<
Resource
name
=
"jdbc/MyDB"
global
=
"jdbc/MyDB"
auth
=
"Container"
type
=
"javax.sql.DataSource"
driverClassName
=
"com.mysql.jdbc.Driver"
url
=
"jdbc:mysql://localhost:3306/UserDB"
username
=
"pankaj"
password
=
"pankaj123"
maxActive
=
"100"
maxIdle
=
"20"
minIdle
=
"5"
maxWait
=
"10000"
/>
|
添加一下代码到tomcat的context.xml中
<
ResourceLink
name
=
"jdbc/MyLocalDB"
global
=
"jdbc/MyDB"
auth
=
"Container"
type
=
"javax.sql.DataSource"
/>
|
提示ResourceLink name
和global的名字不同,我们将在程序中用ResourceLink name来取得数据源
|
package
com.journaldev.jdbc.datasource;
import
java.io.IOException;
import
java.io.PrintWriter;
import
java.sql.Connection;
import
java.sql.ResultSet;
import
java.sql.SQLException;
import
java.sql.Statement;
import
javax.naming.Context;
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;
@WebServlet
(
"/JDBCDataSourceExample"
)
public
class
JDBCDataSourceExample
extends
HttpServlet {
private
static
final
long
serialVersionUID = 1L;
protected
void
doGet(HttpServletRequest request, HttpServletResponse response)
throws
ServletException, IOException {
Context ctx =
null
;
Connection con =
null
;
Statement stmt =
null
;
ResultSet rs =
null
;
try
{
ctx =
new
InitialContext();
DataSource ds = (DataSource) ctx.lookup(
"java:/comp/env/jdbc/MyLocalDB"
);
con = ds.getConnection();
stmt = con.createStatement();
rs = stmt.executeQuery(
"select empid, name from Employee"
);
PrintWriter out = response.getWriter();
response.setContentType(
"text/html"
);
out.print(
"
);
out.print(
"
);
//lets print some DB information
out.print(
"
);
out.print(
"Database Product: "
+con.getMetaData().getDatabaseProductName()+
"
);
out.print(
"Database Driver: "
+con.getMetaData().getDriverName());
out.print(
""
);
}
catch
(NamingException e){
e.printStackTrace();
}
catch
(SQLException e) {
e.printStackTrace();
}
finally
{
try
{
rs.close();
stmt.close();
con.close();
ctx.close();
}
catch
(SQLException e) {
System.out.println(
"Exception in closing DB resources"
);
}
catch
(NamingException e) {
System.out.println(
"Exception in closing Context"
);
}
}
}
}
以上是用的servlet3的新特性,此特性需要在tomcat7或者更高版本中,如果你的tomcat版本较低,可以修改下serlvet使其生效。
我们可以用
或者
这两种方式来获取
如果我们想换成oracle数据库我们只需要修改下配置就可以了
|