Jdbi: المستندات / مثال: قدم مثال (repo) لتوضيح كيفية دمج jdbi3 في spring-boot

تم إنشاؤها على ٢٠ فبراير ٢٠١٨  ·  10تعليقات  ·  مصدر: jdbi/jdbi

أود دمج jdbi3 في حذاء الربيع. لكن من الصعب العثور على جميع القطع المطلوبة في الإنترنت للحصول على الصورة الكاملة.
هل هناك أي فرصة لتوفير مستودع jdbi -amples-repository على جيثب ، والذي يعرض فقط كيفية إعداد تطبيق spring-boot باستخدام jdbi3؟

أنا أقدر ذلك كثيرا. شكرا جزيلا.
/ سيب

doc help wanted improvement

التعليق الأكثر فائدة

لقد كنت أستخدم الطريقة التالية مع jdbi2.x دون أي مشاكل. تم اختباره مع jdbi3.x ولم أر أي مشاكل. يبدو هذا وكأنه طريقة أبسط للحصول على الربيع لإدارة المعاملات أثناء استخدام jdbi.

تقوم بشكل أساسي بلف الوكيل باستخدام TransactionAwareDataSourceProxy واستخدامه لإنشاء مثيل Jdbi. (لدي c / p'd من إجابةarteam حتى تكون الأمثلة متسقة)

    <strong i="8">@Bean</strong>
    public DataSource dataSource() {
        // From Spring Boot's connection pool configuration;
    }

    <strong i="9">@Bean</strong>
    public TransactionAwareDataSourceProxy txDataSource(DataSource dataSource) {
        return new TransactionAwareDataSourceProxy(dataSource);
    }

    <strong i="10">@Bean</strong>
    public PlatformTransactionManager transactionManager(DataSource dataSource) {
        //not sure if this is needed
        return new DataSourceTransactionManager(dataSource);
    }

    <strong i="11">@Bean</strong>
    public Jdbi createJdbi(TransactionAwareDataSourceProxy dataSource) {
        //note that parameter is TransactionAwareDataSourceProxy instead of plain DataSource
        return Jdbi.create(dataSource);
    }

    <strong i="12">@Bean</strong>
    public UserDao userDao(Jdbi jdbi) {
        return jdbi.onDemand(UserDao.class);
    }

ال 10 كومينتر

في حالة بسيطة ، إذا لم تكن بحاجة إلى تكامل مع تسهيلات معاملات Spring ، فيمكنك فقط تهيئة Jdbi و DAOs في تكوين Spring:

    <strong i="7">@Bean</strong>
    public DataSource dataSource() {
        // From Spring Boot's connection pool configuration;
    }

    <strong i="8">@Bean</strong>
    public Jdbi createJdbi(DataSource dataSource) {
        return Jdbi.create(dataSource);
    }

    <strong i="9">@Bean</strong>
    public UserDao userDao(Jdbi jdbi) {
        return jdbi.onDemand(UserDao.class);
    }

مرحبًا bastman ، @ alwins0n في دعم Spring بشكل أفضل في # 989 - هل ترغب في مراجعة عمله حتى الآن والتعليق على ما إذا كان يجعل تكامل Spring أكثر وضوحًا ، أو إذا كنت تطلب شيئًا مختلفًا قليلاً؟

يعد دمج jdbi في spring boot أمرًا تافهًا ، فأنت تحتاج فقط إلى إعداد طريقة مشروحة @Bean في فئة @Configuration لإرجاع مثيل Jdbi - كما هو موضح بواسطة arteam

الأمر الأصعب ، كما حدث في العلاقات العامة الربيعية ، هو دمج jdbi في إدارة المعاملات الربيعية. يجب عليك بالتأكيد التحقق من ذلك ، إذا كان هذا هو ما تبحث عنه.

علاوة على ذلك ، إذا تمت الموافقة على هذا ، فأنا أفكر في إنشاء التكوين التلقائي / بداية التمهيد الربيعي للتمهيد الربيعي (2). إذا كان هذا هو ما تبحث عنه. (إنه في الواقع اختبار جيد إذا كنت تريد تجربة نفسك: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-auto-configuration.html)

لقد كنت أستخدم الطريقة التالية مع jdbi2.x دون أي مشاكل. تم اختباره مع jdbi3.x ولم أر أي مشاكل. يبدو هذا وكأنه طريقة أبسط للحصول على الربيع لإدارة المعاملات أثناء استخدام jdbi.

تقوم بشكل أساسي بلف الوكيل باستخدام TransactionAwareDataSourceProxy واستخدامه لإنشاء مثيل Jdbi. (لدي c / p'd من إجابةarteam حتى تكون الأمثلة متسقة)

    <strong i="8">@Bean</strong>
    public DataSource dataSource() {
        // From Spring Boot's connection pool configuration;
    }

    <strong i="9">@Bean</strong>
    public TransactionAwareDataSourceProxy txDataSource(DataSource dataSource) {
        return new TransactionAwareDataSourceProxy(dataSource);
    }

    <strong i="10">@Bean</strong>
    public PlatformTransactionManager transactionManager(DataSource dataSource) {
        //not sure if this is needed
        return new DataSourceTransactionManager(dataSource);
    }

    <strong i="11">@Bean</strong>
    public Jdbi createJdbi(TransactionAwareDataSourceProxy dataSource) {
        //note that parameter is TransactionAwareDataSourceProxy instead of plain DataSource
        return Jdbi.create(dataSource);
    }

    <strong i="12">@Bean</strong>
    public UserDao userDao(Jdbi jdbi) {
        return jdbi.onDemand(UserDao.class);
    }

تبدو جيدة ، لم أكن أعلم أن هذه الفئة موجودة.

هل يمكنك إلقاء نظرة على العلاقات العامة المذكورة سابقًا؟ كان هناك بالفعل اقتراح بشأن مصنع اتصال "على علم بمعاملة" يستند إلى jdbi.

تظل المشكلة في أن الاتصال والمعالجة ليست حالة متزامنة. لذلك يُرجع هذا ds اتصالاً (مرتبطًا بالمعاملة) يتم إغلاقه عند انتهاء المعاملة. في حين أن المقبض المستخدم ليس مغلقًا ويلقي استثناءات عند محاولة (إعادة) استخدامه.

ولكن ربما لا تكون هذه صفقة كبيرة بل حالة ركنية ، والحل الذي تقدمه يناسب 99٪ من حالات الاستخدام.

باختصار: من خلال أسلوبك ، يكون المورد المُدار للمعاملات هو الاتصال. في العلاقات العامة الخاصة بي ، فإن الموارد المُدارة هي المقبض.

توجد مشاكل متعلقة باستخدام jdbi3 مع stringtemplate4 واستيراد المجموعة. راجع مشكلتي https://github.com/jdbi/jdbi/issues/1052
تتضمن هذه المشكلة أيضًا ارتباطًا بهيكل ريبو يعمل بشكل كامل لاستخدام jdbi3 في الإقلاع الربيعي 2.0.0

عند تطبيق حل kaandok مع تعليق Spring'sTransactional ، أحصل على الاستثناء التالي نظرًا لإغلاق المقابض عند وجود معاملات مفتوحة. هل هناك أي حل موصى به / قابل للتطبيق لذلك؟

"تم اكتشاف معالجة غير صحيحة للمعاملة: تم إغلاق التعامل مع معاملة مفتوحة. يجب الالتزام صراحةً بالمعاملات أو التراجع عنها قبل إغلاق المقبض. قام Jdbi بالتراجع عن هذه المعاملة تلقائيًا."

cengha هل يمكنك تقديم بعض التعليمات البرمجية التي توضح مشكلتك من فضلك؟

يوجد أدناه فئة التكوين:

<strong i="6">@Bean</strong>
public HikariDataSource hikariDataSource() {
    HikariConfig dataSourceConfig = new HikariConfig();
    dataSourceConfig.setDriverClassName(driverClassName);
    dataSourceConfig.setJdbcUrl(jdbcUrl);
    dataSourceConfig.setUsername(username);
    dataSourceConfig.setPassword(password);
    dataSourceConfig.setAutoCommit(true);
    return new HikariDataSource(dataSourceConfig);
}

<strong i="7">@Bean</strong>
public TransactionAwareDataSourceProxy transactionAwareDataSourceProxy(HikariDataSource dataSource) {
    return new TransactionAwareDataSourceProxy(dataSource);
}

<strong i="8">@Bean</strong>
public PlatformTransactionManager platformTransactionManager(HikariDataSource dataSource) {
    return new DataSourceTransactionManager(dataSource);
}

<strong i="9">@Bean</strong>
public Jdbi jdbi(TransactionAwareDataSourceProxy transactionAwareDataSourceProxy) {
    Jdbi jdbi = Jdbi.create(transactionAwareDataSourceProxy);
    jdbi.installPlugin(new SqlObjectPlugin());
    return jdbi;
}

هنا طبقة الخدمة

    <strong i="13">@Override</strong>
    <strong i="14">@Transactional</strong>
    public Long createX(X x) {
        Long aLong = XDao.insertX(x);
        if(true) throw new RuntimeException();
        return aLong;
    }

عند تعيين الالتزام التلقائي على "خطأ" ، تم ذكر خطأ في المعاملة ، ولكن إذا تم تعيينه على "صحيح" ، فلن يكون هناك أي خطأ في المعاملة ولكن لا يعمل التراجع هذه المرة (بعد استثناء وقت التشغيل) وبالتالي يتم استمرار كائن X في قاعدة البيانات. أستخدم الربيع 2.0.3 ، JDBI 3.0.0-beta2.

تم حل المشكلة. كنت أستخدم الإصدار الأقدم من JDBI ، بعد ملاحظة أن هذا الموضوع قام بتحديث المكتبة وتم حل كل شيء.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات