স্প্রিং বুট জেপিএ - স্বতঃ পুনঃসংযোগ কনফিগার করা


107

আমার কাছে একটি দুর্দান্ত ছোট স্প্রিং বুট জেপিএ ওয়েব অ্যাপ্লিকেশন রয়েছে। এটি অ্যামাজন বিয়ানস্টালকে মোতায়েন করা হয় এবং অবিরাম ডেটার জন্য একটি অ্যামাজন আরডিএস ব্যবহার করে। তবে এটি প্রায়শই ব্যবহৃত হয় না এবং তাই এই ধরণের ব্যতিক্রমের সাথে কিছুক্ষণ পরে ব্যর্থ হয়:

com.mysql.jdbc.exferences.jdbc4.CommunicationException: সার্ভারের কাছ থেকে সাফল্যের সাথে প্রাপ্ত সর্বশেষ প্যাকেটটি ছিল 79,870,633 মিলিসেকেন্ড আগে।
সর্বশেষে প্যাকেটটি সার্ভারে সফলভাবে প্রেরণ করা হয়েছিল 79,870,634 মিলিসেকেন্ড আগে। 'অপেক্ষা_টাইমআউট'-এর সার্ভার কনফিগার করা মানের চেয়ে দীর্ঘ। আপনার অ্যাপ্লিকেশনটিতে ব্যবহারের আগে আপনার মেয়াদ উত্তীর্ণ এবং / অথবা সংযোগের বৈধতা পরীক্ষা করা, ক্লায়েন্টের সময়সীমা জন্য সার্ভারের কনফিগার করা মানগুলি বাড়ানো, বা এই সমস্যাটি এড়ানোর জন্য সংযোগকারী / জে সংযোগের বৈশিষ্ট্য 'অটোরেকনেক্ট = ট্রু' ব্যবহার করা উচিত।

এই সেটিংটি কীভাবে কনফিগার করবেন তা আমি নিশ্চিত নই এবং এটিতে http://spring.io (যদিও খুব ভাল সাইট) তে তথ্য খুঁজে পাচ্ছি না । কিছু ধারণা বা তথ্য নির্দেশক কি?


আপনার মুদ্রণ করতে DataSourceএবং এর বৈশিষ্ট্য যাচাই করতে এটি ব্যবহার করুন । stackoverflow.com/a/36586630/148844 স্প্রিং বুটটি স্বনির্ধারিত হবে না DataSourceযদি আপনার যে কোনও @Beansএকটি সংজ্ঞায়িত করা থাকে DataSourcedocs.spring.io/spring-boot/docs/1.5.16.RELEASE/references/…
ক্লো

উত্তর:


141

আমি ধরে নিই যে বুট আপনার জন্য কনফিগার করছে DataSource। এই ক্ষেত্রে এবং যেহেতু আপনি মাইএসকিউএল ব্যবহার করছেন, আপনি নিম্নলিখিতটি আপনার application.properties1.3 অবধি যুক্ত করতে পারেন

spring.datasource.testOnBorrow=true
spring.datasource.validationQuery=SELECT 1

Djxak মন্তব্যে যেমন উল্লেখ করা হয়েছে, চার সংযোগ পুল স্প্রিং বুট সমর্থন জন্য 1.4+ সংজ্ঞায়িত নির্দিষ্ট নামব্যবধান: tomcat, hikari, dbcp, dbcp2( dbcp1.5 এ অনুমোদিত নয়)। আপনি কোন সংযোগ পুলটি ব্যবহার করছেন তা যাচাই করতে হবে এবং সেই বৈশিষ্ট্যটি সমর্থন করে কিনা তা যাচাই করতে হবে। উপরের উদাহরণটি টমক্যাটের জন্য ছিল সুতরাং আপনাকে এটি 1.4+ তে নীচে লিখতে হবে:

spring.datasource.tomcat.testOnBorrow=true 
spring.datasource.tomcat.validationQuery=SELECT 1

মনে রাখবেন যে, ব্যবহার autoReconnectকরা হয় বাঞ্ছনীয় নয় :

এই বৈশিষ্ট্যটির ব্যবহারটি সুপারিশ করা হয় না, কারণ এতে অ্যাপ্লিকেশনগুলি এসকিএএলএক্সেপশনগুলি সঠিকভাবে পরিচালনা করে না এমন সময় সেশন স্টেট এবং ডেটা ধারাবাহিকতার সাথে সম্পর্কিত পার্শ্ব প্রতিক্রিয়া রয়েছে এবং আপনি যখন এসকিউএলএক্সসেপশনগুলি হ্যান্ডেল করার জন্য আপনার অ্যাপ্লিকেশনটি কনফিগার করতে না পারছেন তখনই এটি ব্যবহারের জন্য ডিজাইন করা হয়েছে from মৃত এবং বাসি সংযোগগুলি সঠিকভাবে


8
এটি কারণ আমরা ডকুমেন্টেশনে কীগুলি লেখার সাথে তাল মিলিয়েছি। আমরা সবসময় একটি ব্যবহৃত স্বচ্ছন্দ উভয় তাই দপ্তরী spring.datasource.testOnBorrowএবং spring.datasource.test-on-borrowঠিক সূক্ষ্ম কাজ করবে। আরও তথ্যের জন্য ডকুমেন্টেশন চেক করুন।
স্টিফেন নিকল

17
যেহেতু এটি অন্যকে বিভ্রান্ত করতে পারে: SELECT 1গ্যারান্টি দেয় যে অ্যাপ্লিকেশনটির হাতে দেওয়ার আগে সংযোগটি পরীক্ষা করা হয়েছে। ব্যবহার করে testOnBorrow = true, অবজেক্টগুলি পুল থেকে ধার করার আগে বৈধ করা হবে। যদি বিষয়টি বৈধতা দিতে ব্যর্থ হয় তবে এটি পুল থেকে বাদ দেওয়া হবে এবং অন্যটি ধার করার চেষ্টা করবে। দ্রষ্টব্য - কোনও কার্যকর প্রভাব পেতে সত্যিকারের মানের জন্য, বৈধকরণকুইয়ের প্যারামিটারটি একটি নন-নাল স্ট্রিংয়ে সেট করা আবশ্যক।
রিক

14
সতর্কবাণী! স্প্রিং বুট মধ্যে 1.4+ এই ছিল পরিবর্তিত : চার সংযোগ পুল বসন্ত সমর্থন জন্য নতুন নির্দিষ্ট নামব্যবধান সেখানে সংজ্ঞায়িত করা হয়েছে: tomcat, hikari, dbcp, dbcp2। সুতরাং, উদাহরণস্বরূপ, tomcat-jdbcসংযোগ-পুলের জন্য, বৈশিষ্ট্যগুলি হওয়া উচিত: spring.datasource.tomcat.testOnBorrow=trueএবং spring.datasource.tomcat.validationQuery=SELECT 1
রুসলান স্টেলমাচেনকো

1
যদি আমি নিজেই দুটি পৃথক ডেটাসোর্স কনফিগার করছি তবে আমি এই কনফিগারেশনটি কীভাবে সরবরাহ করব? আমার কি এই কনফিগারেশনটি উভয়ের জন্য স্প্রিং.ড্যাটাসসোর্স.মিড্যাটাসোসর 1. টমক্যাট.টাস্টঅনবোর = সত্য বসন্ত.ড্যাটাসসোর্স.মাইড্যাটাসোর্স 1.টমকাট.অলডিয়েশনকুয়েরি = নির্বাচন করুন 1 স্প্রিং.ড্যাটাসসোর্স.মিড্যাটাসসোস 2.টমক্যাট.টাস্টব্রন্ট.স্রোতস্রোড। mydatasource2.tomcat.uthorationQuery = 1 নির্বাচন করুন বা অনুসরণ করার মতো অন্য কিছু আছে ??
নীতীশ কুমার

2
সতর্কবাণী! আপনি যদি আপনার অ্যাপ্লিকেশনটিতে কোনও ডেটা উত্স @ বিয়ান সংজ্ঞায়িত করেন তবে স্প্রিং বুট পুলটি কনফিগার করবে নাdocs.spring.io/spring-boot/docs/1.5.16.RELEASE/references/… If you define your own DataSource bean, auto-configuration will not occur. আমি OAuth2 এর জন্য একটি গাইড অনুসরণ করেছি @Bean(name = "OAuth") public DataSource secondaryDataSource()...এবং এটি স্বয়ংক্রিয়ভাবে কনফিগার করা হয়নি বা ব্যবহার করা হয়নি testOnBorrow
ক্লো

28

উপরের পরামর্শগুলি আমার পক্ষে কার্যকর হয়নি। সত্যই যা কাজ করেছে তা হ'ল অ্যাপ্লিকেশন.প্রেটিসগুলিতে নিম্নলিখিত লাইনগুলি অন্তর্ভুক্ত করা

spring.datasource.testWhileIdle = true
spring.datasource.timeBetweenEvictionRunsMillis = 3600000
spring.datasource.validationQuery = SELECT 1

আপনি এখানে ব্যাখ্যা খুঁজে পেতে পারেন


5
আপনি যে লিঙ্কটি যুক্ত করেছেন সেটি বলছে যদি ডাটাবেস সংযোগটি 8 ঘণ্টার বেশি সময় ধরে নিষ্ক্রিয় থাকে তবে এটি স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যায় এবং উপরের ত্রুটিটি ঘটবে। সুতরাং, আপনার সমাধানটি সংযোগটি দীর্ঘ-মেয়াদে নিষ্ক্রিয় থাকার জন্য নয়। এসকিউএল সার্ভারটি পুনরায় চালু করার পরে আমি কি কোনও উপায় সংযোগ করতে পারি?
আকেশ্বর ঝা

9

spring.datasource.tomcat.testOnBorrow=trueঅ্যাপ্লিকেশন.সামগ্রীতে সেট করা কাজ করে না।

প্রোগ্রামগতভাবে নীচের মতো সেটিং কোনও সমস্যা ছাড়াই কাজ করেছে।

import org.apache.tomcat.jdbc.pool.DataSource;
import org.apache.tomcat.jdbc.pool.PoolProperties;    

@Bean
public DataSource dataSource() {
    PoolProperties poolProperties = new PoolProperties();
    poolProperties.setUrl(this.properties.getDatabase().getUrl());         
    poolProperties.setUsername(this.properties.getDatabase().getUsername());            
    poolProperties.setPassword(this.properties.getDatabase().getPassword());

    //here it is
    poolProperties.setTestOnBorrow(true);
    poolProperties.setValidationQuery("SELECT 1");

    return new DataSource(poolProperties);
}

1
আপনি যদি একটি কাস্টম ডেটাসোর্স ঘোষণা করছেন তবে এটি কারণ আপনি বসন্তের ডিফল্ট .tomcat ব্যবহার করার চেষ্টা করছেন be সুতরাং যদি আপনি একটি কাস্টম ডেটাসোর্স বিন তৈরি করেন তবে @ConfigrationProperties (উপসর্গ = "বসন্ত.ড্যাটাসসর.টমক্যাট") যুক্ত করুন ডেটাসোর্স বিন এবং তারপরে এটি আপনাকে অ্যাপ্লিকেশন বৈশিষ্ট্যে সেট করার অনুমতি দেবে। আমার উদাহরণ .. @ বিয়ান (নাম = "ম্যানেজমেন্ট ডেটাসোর্স") @ কনফিগারেশনপ্রোপারটিস (উপসর্গ = "ম্যানেজমেন্ট.ডাটাসোর্স") পাবলিক ডেটাসোর্স ডেটাসোর্স () Data ডেটাসোর্সবিল্ডার.ক্রিট () বিল্ড (); । পরিচালন.ড্যাটাসোর্স.টেষ্ট-অন-ধার = সত্য
জাস্টিন

8

আমি স্রেফ স্প্রিং বুট 1.4 এ চলে এসেছি এবং এই বৈশিষ্ট্যগুলির নাম পরিবর্তন করে দেখতে পেয়েছি:

spring.datasource.dbcp.test-while-idle=true
spring.datasource.dbcp.time-between-eviction-runs-millis=3600000
spring.datasource.dbcp.validation-query=SELECT 1

2
নামগুলি সমান। স্প্রিং বুট ডক্সে সম্পত্তি নামকরণের বিভাগটি দেখুন ।
স্টিফেন হ্যারিসন

@ স্টেফেনহ্যারিসন: ডিবিসিপি দেখুন notice
ওয়াইএম

1
@ পাওয়েল: আপনার প্রকল্পে কোন পুলিং বাস্তবায়ন উপলব্ধ তার উপর নির্ভর করে এটি ডিবিসিপি হতে পারে না * * আপনার জন্য সম্পত্তি, এসকিউএল এবং সম্পর্কিত ডেটাসোর্স বৈশিষ্ট্যগুলির
ওয়াইএম

4

হুয়ামির উত্তরটি সঠিক। প্রস্তাবিত হিসাবে বৈশিষ্ট্যগুলি ব্যবহার করে আমি এটি কাজ করতে অক্ষম (স্প্রিং বুট 1.5.3. রিলিজ ব্যবহার করে)

আমি আমার উত্তরটি যুক্ত করছি যেহেতু এটি একটি সম্পূর্ণ কনফিগারেশন শ্রেণি যাতে এটি স্প্রিং বুট ব্যবহার করে এমন কাউকে সহায়তা করতে পারে:

@Configuration
@Log4j
public class SwatDataBaseConfig {

    @Value("${swat.decrypt.location}")
    private String fileLocation;

    @Value("${swat.datasource.url}")
    private String dbURL;

    @Value("${swat.datasource.driver-class-name}")
    private String driverName;

    @Value("${swat.datasource.username}")
    private String userName;

    @Value("${swat.datasource.password}")
    private String hashedPassword;

    @Bean
    public DataSource primaryDataSource() {
        PoolProperties poolProperties = new PoolProperties();
        poolProperties.setUrl(dbURL);
        poolProperties.setUsername(userName);
        poolProperties.setPassword(password);
        poolProperties.setDriverClassName(driverName);
        poolProperties.setTestOnBorrow(true);
        poolProperties.setValidationQuery("SELECT 1");
        poolProperties.setValidationInterval(0);
        DataSource ds = new org.apache.tomcat.jdbc.pool.DataSource(poolProperties);
        return ds;
    }
}

আপনি কি জানেন যে কেন এই কাস্টম কোডটির প্রয়োজন হয় এবং স্প্রিং কেন কেবল এই বৈশিষ্ট্যগুলি ফাইল থেকে পড়বে না? আমার ফাইলে আমার বেশ কয়েকটি ডেটাসোর্স বৈশিষ্ট্য রয়েছে এবং এটি বাকী সমস্ত সমস্যাটি ছাড়াই পড়ে reads
চাচা লম্বা চুল

3

আমারও একই সমস্যা আছে স্প্রিং 4 এবং টোম্যাট 8. আমি স্প্রিং কনফিগারেশন দিয়ে সমস্যার সমাধান করি

<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close">
    <property name="initialSize" value="10" />
    <property name="maxActive" value="25" />
    <property name="maxIdle" value="20" />
    <property name="minIdle" value="10" />
     ...
    <property name="testOnBorrow" value="true" />
    <property name="validationQuery" value="SELECT 1" />
 </bean>

আমি পরীক্ষা করেছি। এটা ভাল কাজ করে! এই দুটি লাইন ডাটাবেসে পুনরায় সংযোগ করতে সমস্ত কিছু করে:

<property name="testOnBorrow" value="true" />
<property name="validationQuery" value="SELECT 1" />

3

যদি কেউ কাস্টম ডেটা সোর্স ব্যবহার করে

@Bean(name = "managementDataSource")
@ConfigurationProperties(prefix = "management.datasource")
public DataSource dataSource() {
    return DataSourceBuilder.create().build();
}

বৈশিষ্ট্যগুলি নীচের মত দেখতে হবে। প্রিফিক্স সহ @ কনফিগারেশন প্রপার্টি লক্ষ্য করুন। উপসর্গটি প্রকৃত সম্পত্তির নামের আগে সমস্ত কিছু

management.datasource.test-on-borrow=true
management.datasource.validation-query=SELECT 1

স্প্রিং সংস্করণ 1.4.4.RELEASE এর জন্য একটি রেফারেন্স


2

কিছু লোক যেমন ইতিমধ্যে চিহ্নিত করেছে, স্প্রিং-বুট ১.৪++ এর মধ্যে চারটি সংযোগ পুলের নির্দিষ্ট নাম স্থান রয়েছে। ডিফল্টরূপে, হিকারিকপটি বসন্ত-বুট 2+ এ ব্যবহৃত হয়। সুতরাং আপনি এসকিউএল এখানে নির্দিষ্ট করতে হবে। ডিফল্ট হয় SELECT 1। উদাহরণস্বরূপ আপনার ডিবি 2 এর জন্য আপনার কী প্রয়োজন হবে তা এখানে রয়েছে: spring.datasource.hikari.connection-test-query=SELECT current date FROM sysibm.sysdummy1

সতর্কীকরণ : আপনার ড্রাইভার JDBC4 সমর্থন করে আমরা দৃঢ়ভাবে এই সম্পত্তি সেটিং না সুপারিশ। এটি "লিগ্যাসি" ড্রাইভারদের জন্য যা জেডিবিসি 4 সংযোগ.আইভালিড () API সমর্থন করে না। এটি এমন ক্যোয়ারী যা ডেটাবেসের সাথে সংযোগটি এখনও বেঁচে আছে তা যাচাই করার জন্য পুল থেকে কোনও সংযোগ দেওয়ার আগে আপনাকে কার্যকর করা হবে। আবার, এই সম্পত্তি ছাড়াই পুলটি চালানোর চেষ্টা করুন, আপনার চালক জেডিবিসি 4 অনুপযুক্ত না হলে আপনাকে জানাতে হিকারিসিপি একটি ত্রুটি লগ করবে। ডিফল্ট: কিছুই নয়


0

যারা একাধিক ডেটা উত্সের সাথে ওয়াইএএমএল থেকে এটি করতে চান তাদের পক্ষে এটি সম্পর্কে একটি দুর্দান্ত ব্লগ পোস্ট রয়েছে: https://springframework.guru/how-to-configure-m Multipleple-data-s स्रोत-in-a-spring-boot অ্যাপ্লিকেশন /

এটি মূলত বলেছে যে আপনার উভয়কেই ডেটা উত্সের বৈশিষ্ট্য এবং এই জাতীয় ডেটাসোর্স কনফিগার করতে হবে:

@Bean
@Primary
@ConfigurationProperties("app.datasource.member")
public DataSourceProperties memberDataSourceProperties() {
    return new DataSourceProperties();
}

@Bean
@Primary
@ConfigurationProperties("app.datasource.member.hikari")
public DataSource memberDataSource() {
    return memberDataSourceProperties().initializeDataSourceBuilder()
            .type(HikariDataSource.class).build();
}

@Primaryঅন্যান্য ডেটা সোর্স থেকে অপসারণ করতে ভুলবেন না ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.