今天在做项目的时候碰到一些问题,自己想了想出现的原因,为了备忘,所以记录下。
我的项目是采用Struts、Spring以及jdbc,其中数据库连接池用的是proxool。在写dao实现层代码的时候,发现所有的方法都要用到数据库的操作类,于是就采用spring注入的方式将数据库操作类注入到dao实现层,具体代码如下:
package com.teabar.dao.impl;
import java.util.List;
import com.teabar.dao.BaseDao;
import com.teabar.db.util.DBOperation;
import com.teabar.db.util.DBRowProcessor;
import com.teabar.db.util.SqlGenerator;
public class BaseDaoImpl<T> implements BaseDao<T> {
public DBOperation dbOperate;
/**
* 保存
*/
public void save(T entity, String tableName) {
try {
dbOperate.executeUpdate(SqlGenerator.insertSql(tableName, entity));
} catch (Exception e) {
e.printStackTrace();
} finally {
dbOperate.close();
}
}
@SuppressWarnings("unchecked")
public T findBy(T entity, String tableName) {
T bean = null;
try {
bean = (T) DBRowProcessor.setToBean(
dbOperate.executeQuery(
SqlGenerator.selectSql(tableName, entity)), entity.getClass());
} catch (Exception e) {
e.printStackTrace();
} finally {
dbOperate.close();
}
return bean ;
}
public void delete(T entity, String tableName) {
try {
dbOperate.executeUpdate(SqlGenerator.deleteSql(tableName, entity));
} catch (Exception e) {
e.printStackTrace();
}
}
public void update(String sql) {
try {
dbOperate.executeUpdate(sql);
} catch (Exception e) {
e.printStackTrace();
} finally {
dbOperate.close();
}
}
/**
* 根据传入的条件语句查找实体,返回相应的实体对象
*/
@SuppressWarnings("unchecked")
public T findBy(String tableName,T entity,String condition) {
T bean = null;
try {
bean = (T) DBRowProcessor.setToBean(
dbOperate.executeQuery(
SqlGenerator.selectSql(tableName, condition)), entity.getClass());
} catch (Exception e) {
e.printStackTrace();
} finally {
dbOperate.close();
}
return bean ;
}
/**
* 取得所有实体对象
*/
public List<T> getAll(String tableName, T entitym) {
return null;
}
/**
* 取得记录总数
*/
public int getTotalRecords(String tableName) {
return 0;
}
public void setDbOperate(DBOperation dbOperate) {
this.dbOperate = dbOperate;
}
}
以下是数据库操作类的代码:
package com.teabar.db.util;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;
import com.teabar.db.DBConnectionManager;
import com.teabar.util.StringUtil;
public class DBOperation {
private DBConnectionManager connectManager;
private Connection connect;
private Vector<Statement> statementGroup;
private Vector<ResultSet> resultSetGroup;
public DBOperation(){
init();
}
public void init(){
this.connectManager = DBConnectionManager.getInstance();
this.connect = this.connectManager.getConnection();
this.statementGroup = new Vector<Statement>();
this.resultSetGroup = new Vector<ResultSet>();
}
public Connection getConnection() {
return this.connect;
}
public Statement getStatement() {
try {
return this.connect.createStatement();
} catch (SQLException e) {
}
return null;
}
public boolean getAutoCommit() throws SQLException{
return this.connect.getAutoCommit();
}
public void setAutoCommit(boolean autoCommit) {
try {
this.connect.setAutoCommit(autoCommit);
} catch (SQLException e) {
}
}
public ResultSet executeQuery(String queryString) throws SQLException{
if(StringUtil.checkNull(queryString))throw new SQLException("sql is null");
Statement localStatement = this.connect.createStatement();
ResultSet localResultSet = localStatement.executeQuery(queryString);
resultSetGroup.add(localResultSet);
statementGroup.add(localStatement);
return localResultSet;
}
public int executeUpdate(String queryString) throws SQLException {
if(StringUtil.checkNull(queryString))throw new SQLException("sql is null");
Statement localStatement = this.connect.createStatement();
this.statementGroup.add(localStatement);
return localStatement.executeUpdate(queryString);
}
public void close() {
try {
if(resultSetGroup!=null) {
for(int i=0; i<resultSetGroup.size(); i++) {
resultSetGroup.get(i).close();
}
resultSetGroup = new Vector<ResultSet>();;
}
if(statementGroup!=null) {
for(int i=0; i<statementGroup.size(); i++) {
statementGroup.get(i).close();
}
statementGroup = new Vector<Statement>();
}
this.connectManager.closeConnection(this.connect);
} catch (SQLException e) {
}
}
}
在spring的配置文件中我是这样配置的:
......
<bean id="dbOperate" class="com.teabar.db.util.DBOperation"/>
<bean name="/login" class="com.teabar.web.user.action.LoginAction" scope="request">
<property name="menberService">
<ref bean="menberService"/>
</property>
</bean>
<bean id="menberService" class="com.teabar.service.user.MenberService">
<property name="menberDao">
<ref bean="menberDao"/>
</property>
</bean>
<bean id="menberDao" class="com.teabar.dao.impl.user.MenberDaoImpl">
<property name="dbOperate">
<ref bean="dbOperate"/>
</property>
</bean>
......
现在,问题就出来了,当我重新部署的时候,控制台报没有注册数据库实例的错误:Attempt to refer to a unregistered pool by its alias......。我仔细想想为什么出现这个错误。分析出以下原因,首先项目中spring的配置文件是以插件的方式加载的如下:
<plug-in
className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml"/>
</plug-in>
而struts的配置文件又是在tomcat启动时被加载的,这样就得出了所有的action实例以及bean实例都是在tomcat启动时初始和实例化的,而我取得数据库连接池的操作是在DBOperation 实现的:
......
public DBOperation(){
init();
}
public void init(){
this.connectManager = DBConnectionManager.getInstance();
this.connect = this.connectManager.getConnection();
this.statementGroup = new Vector<Statement>();
this.resultSetGroup = new Vector<ResultSet>();
}
......
而proxool数据库的连接池必须是通过加载它相关的配置文件后实例化得到的,也就是说在tomcat启动的时候加载proxool的配置文件,以下是proxool在web.xml的配置:
<servlet>
<servlet-name>ServletConfigurator</servlet-name>
<servlet-class>org.logicalcobwebs.proxool.configuration.ServletConfigurator</servlet-class>
<init-param>
<param-name>xmlFile</param-name>
<param-value>WEB-INF/proxool.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
也就是说只有当proxool.xml被加载到内存后,才能进行数据库连接池的操作。而spring的配置文件加载的时间和proxool.xml加载的时间几乎是同一时间,以下可以看出:
......
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<!--加载顺序,值越小,优先级越高-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>ServletConfigurator</servlet-name>
<servlet-class>org.logicalcobwebs.proxool.configuration.ServletConfigurator</servlet-class>
<init-param>
<param-name>xmlFile</param-name>
<param-value>WEB-INF/proxool.xml</param-value>
</init-param>
<!--加载顺序,值越小,优先级越高-->
<load-on-startup>1</load-on-startup>
</servlet>
......
所以,struts的配置文件和proxool的配置文件同时被加载,在没有加载proxool配置文件之前就是用数据库的操作就会报没有注册数据库实例的错误。因此,解决错误的方法就是改变加载struts配置文件的优先级,将其改为2即可。
欢迎大家学习交流,有不对的地方望各位指正。
分享到:
相关推荐
**Spring+Proxool+Hibernate+Struts2+AOP整合详解** 在Java Web开发中,Spring、Proxool、Hibernate、Struts2和AOP(面向切面编程)是常用的框架和技术,它们各自承担着不同的职责,组合使用可以构建出高效、可维护...
在"Spring+proxool+hibernate+struts2+aop"的整合中,Spring负责整体的依赖管理和事务控制,Struts2处理请求转发和视图展示,Hibernate处理数据库操作,而AOP则用来实现跨切面的关注点。 在提供的"Spring+proxool+...
1、proxool官网,下载最新的proxool-0.9.1.jar ...4、整合Struts2、Spring和proxool,配置Web服务启动配置文件[web.xml] 5、整合Spring和proxool,配置应用上下文配置文件[applicationContext.xml]
SSH(Struts2+Spring3+Hibernate3)是一种常见的Java Web开发框架组合,它整合了MVC框架Struts2、依赖注入容器Spring以及持久层框架Hibernate。这些框架的结合为开发者提供了高效、灵活且可扩展的后端架构。在本项目...
- **解密机制**:解释了Proxool如何在运行时自动解密这些加密的凭据,以便与数据库建立连接。 - **安全注意事项**:可能包括关于密钥管理、日志安全等方面的提示,以防止加密机制被绕过。 使用Proxool的加密功能...
Struts2.2.3、Spring2.5.6、Hibernate3.2和Proxool0.9.1是四个重要的Java技术组件,它们在Web应用程序开发中扮演着关键角色。这个压缩包文件包含了这些技术的集成示例,旨在帮助开发者理解和实践如何将它们有效地...
本文将详细介绍如何在Struts2+Spring+Hibernate的环境中配置Proxool连接池。 首先,理解Proxool的工作原理。Proxool是一个基于池化的JDBC代理,它维护着一个数据库连接池,当应用需要访问数据库时,可以从池中获取...
以上步骤完成后,Struts2、Hibernate3.2、Spring2.5与Proxool的整合就完成了。这样的整合不仅使得系统能高效地管理数据库连接,还通过Spring实现了依赖注入,提高了代码的可测试性和可维护性。同时,Struts2处理用户...
Struts2、Spring和Hibernate...整合Struts2、Spring和Hibernate可以实现良好的分层架构,提高代码的可读性和可维护性,同时也方便了事务管理和资源管理。通过合理的配置和设计,可以构建出高效、健壮的企业级Web应用。
这是一个实际使用中的项目,可访问 http://cdbke.cuit.edu.cn 可查看效果及功能,后台需要登录后才能使用(出于安全性考虑这里就不给大家介绍了,另外还有一个struts1版本的,如有需要可以与我联系)。 此项目整合...
这是一个实际使用中的项目,可访问 http://cdbke.cuit.edu.cn 可查看效果及功能,后台需要登录后才能使用(出于安全性考虑这里就不给大家介绍了,另外还有一个struts1版本的,如有需要可以与我联系)。 此项目整合...
《Spring3+Hibernate3+Proxool+jstl+Oracle整合详解》 在现代Java Web开发中,集成各种框架以实现高效、灵活的应用程序已成为常态。本示例代码结合了Spring 3.0.4、Hibernate 3.5.0、Proxool 0.9.1、jstl,并利用...
SSH2全注解整合是Java Web开发中一种高效且现代化的方法,它将Spring 2.5、Struts 2.1和Hibernate 3.3这三个流行框架的优势结合起来,以简化开发流程并提高代码的可维护性。在这个项目中,开发者通过使用注解,避免...
标题中的“spring3 struts2 JPA”是一个经典的Java企业级开发技术栈组合,它涵盖了Spring框架的第三个主要版本、Struts2行动框架以及Java Persistence API(JPA)的使用。这个组合通常用于构建Web应用程序,提供了一...
这是一个实际使用中的项目,可访问 http://cdbke.cuit.edu.cn 可查看效果及功能,后台需要登录后才能使用(出于安全性考虑这里就不给大家介绍了,另外还有一个struts1版本的,如有需要可以与我联系)。 此项目整合...
Struts2与Spring的整合则涉及Action类的定义和Spring的DispatcherServlet配置,以及Struts2的struts.xml文件配置,以便Struts2能够识别并调用Spring管理的Action类。 这个集成方案的实现涉及到了多层架构的设计,...
这是一个实际使用中的项目,可访问 http://cdbke.cuit.edu.cn 可查看效果及功能,后台需要登录后才能使用(出于安全性考虑这里就不给大家介绍了,另外还有一个struts1版本的,如有需要可以与我联系)。 此项目整合...
这是一个实际使用中的项目,可访问 http://cdbke.cuit.edu.cn 可查看效果及功能,后台需要登录后才能使用(出于安全性考虑这里就不给大家介绍了,另外还有一个struts1版本的,如有需要可以与我联系)。 此项目整合...
在Struts2+Spring3+HibernateBBS中,Hibernate可能用于处理数据持久化,将论坛的用户、帖子、评论等业务对象与数据库中的表进行映射。虽然没有直接的Hibernate库文件,但Spring通常会整合Hibernate,所以Spring的...
在IT行业中,集成Struts2、Hibernate3.2和Spring2.5这三大框架是构建高效、可维护的企业级Web应用程序的常见选择。这三者分别负责MVC(Model-View-Controller)架构中的表现层、持久化层和业务逻辑层的管理。下面将...