OSGI容器中的DataSource

时间:2016-12-19 10:28:05

标签: java spring postgresql hibernate osgi

我有一个简单的Spring应用程序通过<bean id="domainEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="persistenceUnitName" value="TheManager" /> <property name="dataSource" ref="domainDataSource" /> <property name="packagesToScan" value="com.conztanz.persistence.stock.model" /> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" /> </property> <property name="jpaProperties"> <props> <prop key="hibernate.hbm2ddl.auto">create-drop</prop> <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop> </props> </property> </bean> <bean id="domainDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="org.postgresql.Driver" /> <property name="url" value="jdbc:postgresql://localhost:5433/dbName" /> <property name="username" value="xxxx" /> <property name="password" value="xxxx" /> </bean>

连接到数据库

所以我必须遵循以下配置:

main

通过ServiceMix类(手动加载AppContext)

进行搜索时,此方法正常

但是,一旦部署到Property 'driverClassName' threw exception; nested exception is java.lang.IllegalStateException: Could not load JDBC driver class [org.postgresql.Driver] ,我就会收到以下错误:

OSGI
  • 我读过DriverManagerdataSource混合不好的地方,但我不明白为什么。
  • 似乎是一个好习惯的解决方案是将OSGI公开为spring context捆绑包,您同意吗?在这种情况下,您如何从EntityManager访问它,以便能够拥有function myFunction() { var item=document.getElementById("todoInput").value var checkBox = document.createElement("input"); checkBox.type = "checkbox"; checkBox.id="checkbox" checkBox.onchange=updateItem var text=document.createTextNode(item) var newItem=document.createElement("li") newItem.className="addedClass" newItem.appendChild(text) if (item === "") { alert("please fill in the blanks"); } else { var crap=document.getElementById("todoList") crap.appendChild(newItem) var addhere=document.getElementById("todoList") addhere.appendChild(checkBox); } function updateItem() { if (document.getElementById("checkbox").checked) { document.getElementById("todoList").style.textDecoration="line-through" } } }

1 个答案:

答案 0 :(得分:3)

DriverManager在OSGi中无法正常工作。最简单的方法是直接使用DataSource。大多数DB驱动程序都有这样的类。如果您在应用程序上下文中实例化它,那么它将起作用。缺点是它会将您的应用程序绑定到数据库驱动程序,因为它会导入DataSource impl的包。

更松散耦合的方式是使用ops4j pax jdbc。它允许从config admin中的配置创建DataSource作为OSGi服务。因此,在您的应用程序上下文中,您只需要向DataSource服务添加依赖项。因此,您的应用程序不受特定数据库驱动程序的约束。一个典型的用例是在测试中使用H2,在生产中使用oracle。