javascript
jooq权限配置_将jOOQ与Spring结合使用:配置
jooq權限配置
我遇到了由ORM引起的性能問題。 盡管我不得不承認大多數這些問題確實是由您造成的,但是我開始認為在只讀操作中使用ORM是不值得的。
我開始尋找實現這些操作的替代方法。
這就是我遇到jOOQ的方式 ,它指出:
jOOQ從您的數據庫生成Java代碼,并允許您通過其流暢的API構建類型安全SQL查詢。
這看起來非常有趣,因此我決定試一試,并與您分享我的發現。
這篇博客文章是“將jOOQ與Spring結合使用”系列的第一部分,它描述了如何獲取所需的依賴關系以及如何配置應用程序的應用程序上下文。
讓我們開始吧。
使用Maven獲取所需的依賴關系
我們的應用程序的依賴項是:
- Spring Framework 3.2.6。 此時,我們的示例使用aop , bean , core , context , context-support , jdbc和tx模塊。
- cglib 3.1。
- BoneCP 0.8.0。 我們使用BoneCP作為示例應用程序的連接池。
- jOOQ 3.2.2。
- H2 1.3.174。 我們使用H2作為示例應用程序的數據庫。
如果您想獲得有關Spring Framework模塊的更多信息,請閱讀Spring Framework Reference Documentation的1.2節 。
該示例應用程序使用Spring Framework 3.2.6而非4.0的原因是,目前spring-test-dbunit與Spring Framework 4.0不兼容 。
pom.xml文件的相關部分如下所示:
<dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>3.2.6.RELEASE</version> </dependency> <dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>3.2.6.RELEASE</version> </dependency> <dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>3.2.6.RELEASE</version> </Dependency> <dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>3.2.6.RELEASE</version> </dependency> <dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>3.2.6.RELEASE</version> </dependency> <dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId><version>3.2.6.RELEASE</version> </dependency> <dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>3.2.6.RELEASE</version> </dependency> <dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>3.2.6.RELEASE</version> </dependency><dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.1</version> </dependency><dependency><groupId>com.jolbox</groupId><artifactId>bonecp</artifactId><version>0.8.0.RELEASE</version> </dependency><dependency><groupId>org.jooq</groupId><artifactId>jooq</artifactId><version>3.2.2</version> </dependency><dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><version>1.3.174</version> </dependency>- 該博客文章的示例應用程序還具有其他依賴性。 通過查看pom.xml文件,可以看到完整的依賴項列表。
讓我們繼續研究如何將jOOQ拋出的異常轉換為Spring DataAccessExceptions 。
將jOOQ異常轉換為Spring DataAccessException
為什么我們要將jOOQ拋出的異常轉換為Spring DataAccessExceptions ?
這樣做的一個原因是我們希望我們的集成工作與Spring框架的DAO支持相同。 這種支持的一個基本部分是一致的異常層次結構 :
Spring提供了從技術特定的異常(如SQLException)到其自己的異常類層次結構(以DataAccessException作為根異常)的便捷轉換。 這些異常包裝了原始異常,因此永遠不會冒任何可能丟失任何錯誤信息的風險。
換句話說,如果我們希望我們的應用程序是“好公民”,那么確保我們的配置將jOOQ拋出的異常轉換為Spring DataAccessExceptions是有意義的。
我們可以按照以下步驟創建提供此功能的組件:
JOOQToSpringExceptionTransformer類的源代碼如下所示:
import org.jooq.ExecuteContext; import org.jooq.SQLDialect; import org.jooq.impl.DefaultExecuteListener; import org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator; import org.springframework.jdbc.support.SQLExceptionTranslator; import org.springframework.jdbc.support.SQLStateSQLExceptionTranslator;public class JOOQToSpringExceptionTransformer extends DefaultExecuteListener {@Overridepublic void exception(ExecuteContext ctx) {SQLDialect dialect = ctx.configuration().dialect();SQLExceptionTranslator translator = (dialect != null)? new SQLErrorCodeSQLExceptionTranslator(dialect.name()): new SQLStateSQLExceptionTranslator();ctx.exception(translator.translate("jOOQ", ctx.sql(), ctx.sqlException()));} }這不是我的主意 。 我從亞當·澤爾(Adam Zell)的要旨(Gist)中得到了這個想法。
補充閱讀:
- jOOQ用戶手冊的第4.2.5節“自定義ExecuteListeners”
- Spring框架參考文檔的第14.2.3節“ SQLExceptionTranslator”
我們的工作還沒有完成。 讓我們放在一起,通過配置示例應用程序的應用程序上下文來完成我們的工作。
配置應用程序上下文
本節說明如何使用Java配置來配置應用程序的應用程序上下文。
讓我們開始創建一個屬性文件,其中包含示例應用程序的配置。
實際應用程序的構建過程基于Maven配置文件。 這確保了我們可以在不同的環境中使用不同的配置。 您可以閱讀我的博客文章“ 使用Maven創建配置文件特定的配置文件”,以獲取有關此內容的更多信息。
創建屬性文件
我們可以按照以下步驟創建屬性文件:
application.properties文件如下所示:
#Database Configuration db.driver=org.h2.Driver db.url=jdbc:h2:target/jooq-example db.username=sa db.password=#jOOQ Configuration jooq.sql.dialect=H2#DB Schema db.schema.script=schema.sql- SQLDialect枚舉的Javadoc指定jOOQ支持的數據庫方言列表。
讓我們繼續研究如何使用Java配置來配置應用程序的應用程序上下文。
創建配置類
我們可以按照以下步驟配置應用程序的應用程序上下文:
PersistenceContext類的源代碼如下所示:
import com.jolbox.bonecp.BoneCPDataSource; import org.jooq.SQLDialect; import org.jooq.impl.DataSourceConnectionProvider; import org.jooq.impl.DefaultConfiguration; import org.jooq.impl.DefaultDSLContext; import org.jooq.impl.DefaultExecuteListenerProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; import org.springframework.core.env.Environment; import org.springframework.core.io.ClassPathResource; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy; import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy; import org.springframework.jdbc.datasource.init.DataSourceInitializer; import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator; import org.springframework.transaction.annotation.EnableTransactionManagement;import javax.sql.DataSource;@Configuration @ComponentScan({"net.petrikainulainen.spring.jooq.todo"}) @EnableTransactionManagement @PropertySource("classpath:application.properties") public class PersistenceContext {@Autowiredprivate Environment env;@Bean(destroyMethod = "close")public DataSource dataSource() {BoneCPDataSource dataSource = new BoneCPDataSource();dataSource.setDriverClass(env.getRequiredProperty("db.driver"));dataSource.setJdbcUrl(env.getRequiredProperty("db.url"));dataSource.setUsername(env.getRequiredProperty("db.username"));dataSource.setPassword(env.getRequiredProperty("db.password"));return dataSource;}@Beanpublic LazyConnectionDataSourceProxy lazyConnectionDataSource() {return new LazyConnectionDataSourceProxy(dataSource());}@Beanpublic TransactionAwareDataSourceProxy transactionAwareDataSource() {return new TransactionAwareDataSourceProxy(lazyConnectionDataSource());}@Beanpublic DataSourceTransactionManager transactionManager() {return new DataSourceTransactionManager(lazyConnectionDataSource());}@Beanpublic DataSourceConnectionProvider connectionProvider() {return new DataSourceConnectionProvider(transactionAwareDataSource());}@Beanpublic JOOQToSpringExceptionTransformer jooqToSpringExceptionTransformer() {return new JOOQToSpringExceptionTransformer();}@Beanpublic DefaultConfiguration configuration() {DefaultConfiguration jooqConfiguration = new DefaultConfiguration();jooqConfiguration.set(connectionProvider());jooqConfiguration.set(new DefaultExecuteListenerProvider(jooqToSpringExceptionTransformer()));String sqlDialectName = env.getRequiredProperty("jooq.sql.dialect");SQLDialect dialect = SQLDialect.valueOf(sqlDialectName);jooqConfiguration.set(dialect);return jooqConfiguration;}@Beanpublic DefaultDSLContext dsl() {return new DefaultDSLContext(configuration());}@Beanpublic DataSourceInitializer dataSourceInitializer() {DataSourceInitializer initializer = new DataSourceInitializer();initializer.setDataSource(dataSource());ResourceDatabasePopulator populator = new ResourceDatabasePopulator();populator.addScript(new ClassPathResource(env.getRequiredProperty("db.schema.script")));initializer.setDatabasePopulator(populator);return initializer;} }如果要使用XML配置文件配置應用程序上下文,則示例應用程序也具有有效的XML配置文件 。
學分:
- 該配置基于jOOQ用戶手冊的3.4.3節 。
- Sergey Epik發布的消息幫助我弄清楚了如何向jOOQ配置添加自定義ExecuteListeners。
- Peter Ertl給了我一個使用LazyConnectionDataSourceProxy的想法。
我們如何知道此配置有效? 這是一個好問題。 我們將在下一節中討論。
這真的有效嗎?
當我開始研究如何確保用jOOQ創建的數據庫查詢參與Spring管理的事務時,我注意到這不是一個容易解決的問題 。
這篇博客文章的示例應用程序具有一些集成測試,這些測試可以確保事務(提交和回滾)在非常簡單的情況下正常工作。 但是,在使用此博客文章中描述的解決方案時,我們必須考慮兩件事:
1.使用jOOQ創建的所有數據庫查詢必須在事務內執行。
TransactionAwareDataSourceProxy類的Javadoc指出:
委托DataSourceUtils自動參與線程綁定的事務,例如由DataSourceTransactionManager管理。 返回的Connection上的getConnection調用和close調用將在事務中正常運行,即始終在事務Connection上運行。 如果不在事務內,則將應用正常的DataSource行為。
換句話說,如果您執行多個復雜的操作而沒有事務,則jOOQ將為每個操作使用不同的連接。 這可能會導致競賽條件錯誤。
在閱讀Ben Manes撰寫的這篇評論時,我注意到了這個問題。
2. Javadoc不建議使用TransactionAwareDataSourceProxy 。
TransactionAwareDataSourceProxy類的Javadoc具有如下部分:
與J2EE / JTA環境中的JDBC代碼類似,該代理允許數據訪問代碼與普通JDBC API一起使用,并且仍參與Spring管理的事務。 但是,如果可能,即使沒有目標DataSource的代理,也可以使用Spring的DataSourceUtils , JdbcTemplate或JDBC操作對象來獲取事務參與,從而避免了首先定義此類代理的麻煩。
這是一個非常模糊的評論,因為它沒有解釋為什么我們不應該使用它。 Adam Zell建議 ,由于該類使用反射,因此使用反射可能會導致性能問題。
如果您遇到性能問題,則可能要使用
亞當·澤爾的要點 。
摘要
現在,我們已經成功配置了示例應用程序的應用程序上下文。 本教程教了四件事:
- 我們了解了如何使用Maven獲得所需的依賴關系。
- 我們學習了如何將jOOQ引發的異常轉換為Spring DataAccessExceptions 。
- 我們學習了如何配置使用jOOQ和Spring的應用程序的應用程序上下文。
- 當我們使用此博客文章中描述的方法時,我們快速考慮了必須考慮的事項。
本教程的下一部分描述了我們可以使用jOOQ的代碼生成支持 。
Github上提供了此博客文章的示例應用程序。
補充閱讀:
Vlad Mihalcea也寫了有關jOOQ的文章 。 查看他的博客!
翻譯自: https://www.javacodegeeks.com/2014/01/using-jooq-with-spring-configuration.html
jooq權限配置
總結
以上是生活随笔為你收集整理的jooq权限配置_将jOOQ与Spring结合使用:配置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓禁止联网工具(安卓禁止联网)
- 下一篇: 商混备案证有效期多长时间(商混备案证)