我正在使用Spring 4来设置我使用Hibernate 4所需的东西。我在我的DAO层中有一个SessionFactory
自动装配。当我致电sessionFactory.getCurrentSession()
时,我收到错误:
Exception in thread "MyImporterThread" org.hibernate.service.UnknownServiceException: Unknown service requested [org.hibernate.engine.jdbc.connections.spi.ConnectionProvider]
我在这个例外中查看过Google的许多搜索结果(包括StackOverflow中的一些搜索结果),但是没有一个能让我感到震惊,因为我解决了这个问题。
这是我的配置:
弹簧-beans.xml文件:
<context:property-placeholder location="file:spring.properties" />
<context:component-scan base-package="com.company.scraping" />
<!-- Data Source -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver.class}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.user}" />
<property name="password" value="${jdbc.password}" />
</bean>
<!-- Session Factory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan" value="com.company.scraping" />
<property name="configLocation">
<value>file:scraping.db.hibernate.cfg.xml</value>
</property>
</bean>
<!-- Transaction Stuff -->
<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- beans that are transactional or autowired -->
<bean id="scrapingDao" class="com.company.scraping.dao.ReportsScrapingDaoImpl" />
<bean id="scrapingService" class="com.company.scraping.service.ReportsScrapingServiceImpl" />
spring.properties:
jdbc.driver.class=oracle.jdbc.OracleDriver
jdbc.url=jdbc:oracle:thin:@server:1521:testdb01
jdbc.user=user
jdbc.password=password
scraping.db.hibernate.cfg.xml:
<hibernate-configuration>
<session-factory>
<property name="connection.url">jdbc:oracle:thin:@server:1521:testdb01</property>
<property name="connection.username">user</property>
<property name="connection.password">password</property>
<property name="connection.driver_class">oracle.jdbc.OracleDriver</property>
<property name="hibernate.connection.autocommit">true</property>
<property name="hibernate.generate_statistics">false</property>
<property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
<property name="hibernate.show_sql">false</property>
</session-factory>
</hibernate-configuration>
由于这不是一个Web应用程序,我使用ApplicationContext context = new FileSystemXmlApplicationContext(args[0])
初始化Spring。
我的服务类是自动装配的(未在配置中显示,因为我必须输入所有这些),并包含DAO的自动装配实例。这就是DAO的样子:
@org.springframework.stereotype.Repository
@org.springframework.transaction.annotation.Transactional
public class ReportsScrapingDaoImpl implements ReportsScrapingDao
{
@Autowired
@Qualifier("sessionFactory")
private SessionFactory sessionFactory;
@Override
@Transaction(readOnly = true)
public List<Stuff> getAll()
{
Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Stuff.class);
... (more code)
}
}
代码在调用sessionFactory.getCurrentSession()
时爆炸。我也尝试过使用sessionFactory.openSession()
,但它也给出了相同的结果。我不确定这里发生了什么。
答案 0 :(得分:0)
我做了最后一次搜索并且this出现了。 Eclipse输出编译器警告,抱怨可能存在资源泄漏,因为ApplicationContext
从未关闭。我在main
方法的最后添加了一行(在所有Threads
启动后)以关闭ApplicationContext
。一旦我摆脱关闭ApplicationContext
的线,问题就消失了。
故事的道德是你的ApplicationContext
不应该被关闭,直到你不再需要任何东西 - 所以你可能永远不会关闭它。