在GWT中的多个RemoteServiceServlet之间共享数据库参考

时间:2011-05-26 08:46:45

标签: database gwt reference share

我正在开发一个需要连接MySQL数据库的GWT应用程序。我可以成功地为servlet做到这一点。但是我需要多个“RemoteServiceServlets”来共享一个Conection参考,因为每次创建一个新的没有任何意义。

我怎么能做到这一点?

2 个答案:

答案 0 :(得分:2)

在多个用户访问它的servlet环境中共享单个JDBC连接会产生严重后果:http://forums.oracle.com/forums/thread.jspa?threadID=554427

简而言之:单个连接表示执行单个系列的单个DBMS用户 查询和/或更新,任何给定的一个事务有效 时刻。

因此,基本上在servlet环境中,必须使用JDBC连接池,从可重用连接池中获取新连接,但单个连接一次只能由一个servlet使用。以下是一个示例实现:http://java.sun.com/developer/onlineTraining/Programming/JDCBook/conpool.html

答案 1 :(得分:0)

如果您愿意使用Spring,我建议尝试使用此处描述的方法http://pgt.de/2009/07/17/non-invasive-gwt-and-spring-integration-reloaded/,我将其用于GWT中的一些项目。

将弹簧上下文配置添加到web.xml文件

<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>/WEB-INF/application-context.xml</param-value>
</context-param>

<listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener
  </listener-class>
</listener>

在上下文文件中定义数据源

<bean id="dataSource" destroy-method="close"
  class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="${jdbc.driverClassName}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
</bean>

让您的servlet扩展

public class AutoinjectingRemoteServiceServlet extends RemoteServiceServlet {

@Override
public void init(ServletConfig config) throws ServletException {
    super.init(config);
    WebApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(config.getServletContext());
    AutowireCapableBeanFactory beanFactory = ctx.getAutowireCapableBeanFactory();
    beanFactory.autowireBean(this);
}

}

然后在所有servlet中使用数据源作为spring bean

public class MyServiceImpl extends AutoinjectingRemoteServiceServlet implements MyService {

  @Autowired
  private DataSource dataSource;

  ...