日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

jooq权限配置_将jOOQ与Spring结合使用:配置

發(fā)布時間:2023/12/3 javascript 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jooq权限配置_将jOOQ与Spring结合使用:配置 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

jooq權限配置

我遇到了由ORM引起的性能問題。 盡管我不得不承認大多數(shù)這些問題確實是由您造成的,但是我開始認為在只讀操作中使用ORM是不值得的。

我開始尋找實現(xiàn)這些操作的替代方法。

這就是我遇到jOOQ的方式 ,它指出:

jOOQ從您的數(shù)據(jù)庫生成Java代碼,并允許您通過其流暢的API構建類型安全SQL查詢。

這看起來非常有趣,因此我決定試一試,并與您分享我的發(fā)現(xiàn)。

這篇博客文章是“將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作為示例應用程序的數(shù)據(jù)庫。

如果您想獲得有關Spring Framework模塊的更多信息,請閱讀Spring Framework Reference Documentation的1.2節(jié) 。

該示例應用程序使用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文件,可以看到完整的依賴項列表。

讓我們繼續(xù)研究如何將jOOQ拋出的異常轉(zhuǎn)換為Spring DataAccessExceptions 。

將jOOQ異常轉(zhuǎn)換為Spring DataAccessException

為什么我們要將jOOQ拋出的異常轉(zhuǎn)換為Spring DataAccessExceptions ?

這樣做的一個原因是我們希望我們的集成工作與Spring框架的DAO支持相同。 這種支持的一個基本部分是一致的異常層次結構 :

Spring提供了從技術特定的異常(如SQLException)到其自己的異常類層次結構(以DataAccessException作為根異常)的便捷轉(zhuǎn)換。 這些異常包裝了原始異常,因此永遠不會冒任何可能丟失任何錯誤信息的風險。

換句話說,如果我們希望我們的應用程序是“好公民”,那么確保我們的配置將jOOQ拋出的異常轉(zhuǎn)換為Spring DataAccessExceptions是有意義的。

我們可以按照以下步驟創(chuàng)建提供此功能的組件:

  • 創(chuàng)建一個JOOQToSpringExceptionTransformer類,該類擴展了DefaultExecuteListener類。 DefaultExecuteListener類是ExecuteListener接口的公共默認實現(xiàn),該接口為單個查詢執(zhí)行的不同生命周期事件提供偵聽器方法。
  • 重寫DefaultExecuteListener類的exception(ExecuteContext ctx)方法 。 如果在執(zhí)行生命周期的任何時刻引發(fā)異常,則調(diào)用此方法。 通過執(zhí)行以下步驟來實現(xiàn)該方法:
  • 從jOOQ配置中獲取一個SQLDialect對象。
  • 通過遵循以下規(guī)則創(chuàng)建一個實現(xiàn)SQLExceptionTranslator接口的對象:
  • 如果找到已配置SQL方言,請創(chuàng)建一個新的SQLErrorCodeSQLExceptionTranslator對象,并將SQL方言的名稱作為構造函數(shù)參數(shù)傳遞。 此類通過分析供應商特定的錯誤代碼來“選擇”正確的DataAccessException 。
  • 如果找不到SQL方言,請創(chuàng)建一個新的SQLStateSQLExceptionTranslator對象。 此類通過分析存儲到SQLExceptionSQL狀態(tài)來“選擇”正確的DataAccessException 。
  • 通過使用創(chuàng)建SQLExceptionTranslator對象創(chuàng)建DataAccessException 對象 。
  • 將拋出的DataAccessException轉(zhuǎn)發(fā)給作為方法參數(shù)給出的ExecuteContext對象。
  • 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節(jié)“自定義ExecuteListeners”
    • Spring框架參考文檔的第14.2.3節(jié)“ SQLExceptionTranslator”

    我們的工作還沒有完成。 讓我們放在一起,通過配置示例應用程序的應用程序上下文來完成我們的工作。

    配置應用程序上下文

    本節(jié)說明如何使用Java配置來配置應用程序的應用程序上下文。

    讓我們開始創(chuàng)建一個屬性文件,其中包含示例應用程序的配置。

    實際應用程序的構建過程基于Maven配置文件。 這確保了我們可以在不同的環(huán)境中使用不同的配置。 您可以閱讀我的博客文章“ 使用Maven創(chuàng)建配置文件特定的配置文件”,以獲取有關此內(nèi)容的更多信息。

    創(chuàng)建屬性文件

    我們可以按照以下步驟創(chuàng)建屬性文件:

  • 配置數(shù)據(jù)庫連接。 我們需要配置JDBC驅(qū)動程序類,JDBC URL,數(shù)據(jù)庫用戶的用戶名和數(shù)據(jù)庫用戶的密碼。
  • 配置使用SQL方言的名稱。
  • 配置創(chuàng)建示例應用程序數(shù)據(jù)庫SQL腳本的名稱(這是一個可選步驟,如果您的應用程序不使用嵌入式數(shù)據(jù)庫,則不需要此步驟)。
  • 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支持的數(shù)據(jù)庫方言列表。

    讓我們繼續(xù)研究如何使用Java配置來配置應用程序的應用程序上下文。

    創(chuàng)建配置類

    我們可以按照以下步驟配置應用程序的應用程序上下文:

  • 創(chuàng)建一個PersistenceContext類。
  • 通過使用@Configuration批注注釋該類,確保將創(chuàng)建的類識別為配置類。
  • 確保在組件掃描期間找到我們應用程序的jOOQ存儲庫。 我們可以通過使用@ComponentScan注釋對配置類進行注釋來做到這一點。
  • 通過使用@EnableTransactionManagement注釋對配置類進行注釋,以啟用注釋驅(qū)動的事務管理。
  • 確保從類路徑中找到的application.properties文件中加載了我們應用程序的配置。 我們可以通過使用@PropertySource注釋對配置類進行注釋來執(zhí)行此操作。
  • 在配置類中添加一個Environment字段,并使用@Autowired注釋對該字段進行注釋。 我們使用Environment對象獲取從application.properties文件加載的配置屬性的屬性值。
  • 配置數(shù)據(jù)源 bean。 因為我們的應用程序使用BoneCP,所以我們創(chuàng)建了一個BoneCPDataSource對象作為我們的數(shù)據(jù)源。
  • 配置LazyConnectionDataSourceProxy bean。 該bean確保延遲獲取數(shù)據(jù)庫連接(即,在創(chuàng)建第一條語句時)。
  • 配置TransactionAwareDataSourceProxy bean。 該bean確保所有JDBC連接都知道Spring管理的事務。 換句話說,JDBC連接參與線程綁定的事務。
  • 配置DataSourceTransactionManager bean。 創(chuàng)建新的DataSourceTransactionManager對象時,必須將LazyConnectionDataSourceProxy Bean作為構造函數(shù)參數(shù)傳遞
  • 配置DataSourceConnectionProvider bean。 jOOQ將從作為構造函數(shù)參數(shù)給出的數(shù)據(jù)源中獲取使用的連接。 創(chuàng)建新的DataSourceConnectionProvider對象時,必須將TransactionAwareDataSourceProxy bean作為構造函數(shù)參數(shù)傳遞 。 這樣可以確保創(chuàng)建的jOOQ查詢參與Spring管理的事務。
  • 配置JOOQToSpringExceptionTransformer bean。
  • 配置DefaultConfiguration bean。 此類是Configuration接口的默認實現(xiàn),我們可以使用它來配置jOOQ。 我們必須配置三件事:
  • 我們必須設置的ConnectionProvider,這是用來獲取和釋放數(shù)據(jù)庫連接。
  • 我們必須配置自定義執(zhí)行偵聽器 。 換句話說,我們必須將JOOQToSpringExceptionTransformer bean添加到創(chuàng)建的DefaultConfiguration對象中。 這確保了jOOQ拋出的異常被轉(zhuǎn)換為Spring DataAccessExceptions 。
  • 我們必須配置使用SQL方言。
  • 配置DefaultDSLContext bean。 在使用jOOQ創(chuàng)建數(shù)據(jù)庫查詢時,將使用此bean。
  • 配置DataSourceInitializer bean。 啟動應用程序時,我們使用此bean創(chuàng)建H2數(shù)據(jù)庫的數(shù)據(jù)庫架構(如果您不使用嵌入式數(shù)據(jù)庫,則不必配置此bean)。
  • 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節(jié) 。
    • Sergey Epik發(fā)布的消息幫助我弄清楚了如何向jOOQ配置添加自定義ExecuteListeners。
    • Peter Ertl給了我一個使用LazyConnectionDataSourceProxy的想法。

    我們?nèi)绾沃来伺渲糜行?#xff1f; 這是一個好問題。 我們將在下一節(jié)中討論。

    這真的有效嗎?

    當我開始研究如何確保用jOOQ創(chuàng)建的數(shù)據(jù)庫查詢參與Spring管理的事務時,我注意到這不是一個容易解決的問題 。

    這篇博客文章的示例應用程序具有一些集成測試,這些測試可以確保事務(提交和回滾)在非常簡單的情況下正常工作。 但是,在使用此博客文章中描述的解決方案時,我們必須考慮兩件事:

    1.使用jOOQ創(chuàng)建的所有數(shù)據(jù)庫查詢必須在事務內(nèi)執(zhí)行。

    TransactionAwareDataSourceProxy類的Javadoc指出:

    委托DataSourceUtils自動參與線程綁定的事務,例如由DataSourceTransactionManager管理。 返回的Connection上的getConnection調(diào)用和close調(diào)用將在事務中正常運行,即始終在事務Connection上運行。 如果不在事務內(nèi),則將應用正常的DataSource行為。

    換句話說,如果您執(zhí)行多個復雜的操作而沒有事務,則jOOQ將為每個操作使用不同的連接。 這可能會導致競賽條件錯誤。

    在閱讀Ben Manes撰寫的這篇評論時,我注意到了這個問題。

    2. Javadoc不建議使用TransactionAwareDataSourceProxy 。

    TransactionAwareDataSourceProxy類的Javadoc具有如下部分:

    與J2EE / JTA環(huán)境中的JDBC代碼類似,該代理允許數(shù)據(jù)訪問代碼與普通JDBC API一起使用,并且仍參與Spring管理的事務。 但是,如果可能,即使沒有目標DataSource的代理,也可以使用Spring的DataSourceUtils , JdbcTemplate或JDBC操作對象來獲取事務參與,從而避免了首先定義此類代理的麻煩。

    這是一個非常模糊的評論,因為它沒有解釋為什么我們不應該使用它。 Adam Zell建議 ,由于該類使用反射,因此使用反射可能會導致性能問題。

    如果您遇到性能問題,則可能要使用
    亞當·澤爾的要點 。

    摘要

    現(xiàn)在,我們已經(jīng)成功配置了示例應用程序的應用程序上下文。 本教程教了四件事:

    • 我們了解了如何使用Maven獲得所需的依賴關系。
    • 我們學習了如何將jOOQ引發(fā)的異常轉(zhuǎn)換為Spring DataAccessExceptions 。
    • 我們學習了如何配置使用jOOQ和Spring的應用程序的應用程序上下文。
    • 當我們使用此博客文章中描述的方法時,我們快速考慮了必須考慮的事項。

    本教程的下一部分描述了我們可以使用jOOQ的代碼生成支持 。

    Github上提供了此博客文章的示例應用程序。

    補充閱讀:

    Vlad Mihalcea也寫了有關jOOQ的文章 。 查看他的博客!

    參考: 將jOOQ與Spring結合使用:來自Petri Kainulainen博客的JCG合作伙伴 Petri Kainulainen進行的配置 。

    翻譯自: https://www.javacodegeeks.com/2014/01/using-jooq-with-spring-configuration.html

    jooq權限配置

    總結

    以上是生活随笔為你收集整理的jooq权限配置_将jOOQ与Spring结合使用:配置的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。