无法创建子事件循环/无法打开新的选择器/打开的文件过多

时间:2018-07-19 11:55:23

标签: java spring-boot cassandra cassandra-driver

有30个或更多并发请求时,我收到类似“无法创建子事件循环/无法打开新选择器/打开文件太多”之类的错误...如何解决以上错误?我做错什么了吗?我正在使用Spring boot和Java cassandra驱动程序。 下面是连接文件

public class Connection {

public static Session getConnection() {

    final Cluster cluster = Cluster.builder().addContactPoint(ConnectionBean.getCASSANDRA_DB_IP())
            .withQueryOptions(new QueryOptions().setConsistencyLevel(ConsistencyLevel.LOCAL_ONE))
            .withCredentials(ConnectionBean.getCASSANDRA_USER(), ConnectionBean.getCASSANDRA_PASSWORD())
            .withPoolingOptions(poolingOptions)
            .build();
    final Session session = cluster.connect(ConnectionBean.getCASSANDRA_DB_NAME());
    return session;
}

}

下面是我在Connection文件中使用的ConnectionBean文件:

public  class ConnectionBean {

public static   String CASSANDRA_DB_IP;
public static String CASSANDRA_DB_NAME;
public static  String CASSANDRA_USER;
public static String CASSANDRA_PASSWORD;

public ConnectionBean() {

}
public ConnectionBean(String CASSANDRA_DB_IP,String CASSANDRA_DB_NAME,String CASSANDRA_USER,String CASSANDRA_PASSWORD) {
this.CASSANDRA_DB_IP=CASSANDRA_DB_IP;
this.CASSANDRA_DB_NAME=CASSANDRA_DB_NAME;
this.CASSANDRA_USER=CASSANDRA_USER;
this.CASSANDRA_PASSWORD=CASSANDRA_PASSWORD;
}

public static String getCASSANDRA_DB_IP() {
    return CASSANDRA_DB_IP;
}
public static void setCASSANDRA_DB_IP(String cASSANDRA_DB_IP) {
    CASSANDRA_DB_IP = cASSANDRA_DB_IP;
}
public static String getCASSANDRA_DB_NAME() {
    return CASSANDRA_DB_NAME;
}
public static void setCASSANDRA_DB_NAME(String cASSANDRA_DB_NAME) {
    CASSANDRA_DB_NAME = cASSANDRA_DB_NAME;
}
public static String getCASSANDRA_USER() {
    return CASSANDRA_USER;
}
public static void setCASSANDRA_USER(String cASSANDRA_USER) {
    CASSANDRA_USER = cASSANDRA_USER;
}
public static String getCASSANDRA_PASSWORD() {
    return CASSANDRA_PASSWORD;
}
public static void setCASSANDRA_PASSWORD(String cASSANDRA_PASSWORD) {
    CASSANDRA_PASSWORD = cASSANDRA_PASSWORD;
}   

}

下面是初始化ConnectionBean变量的类:

public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
private static final String LOGIN_PROCESSING_URL = "/login";
private static final String LOGIN_FAILURE_URL = "/login?error";
private static final String LOGIN_URL = "/login";

@Autowired
private BCryptPasswordEncoder bCryptPasswordEncoder;

@Autowired
private DataSource dataSource;

@Value("${spring.queries.users-query}")
private String usersQuery;

@Value("${spring.queries.roles-query}")
private String rolesQuery;

@Value("${CASSANDRA_DB_IP}")
public String CASSANDRA_DB_IP;

@Value("${CASSANDRA_DB_NAME}")
public String CASSANDRA_DB_NAME;

@Value("${CASSANDRA_USER}")
public String CASSANDRA_USER;

@Value("${CASSANDRA_PASSWORD}")
public String CASSANDRA_PASSWORD;

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    ConnectionBean cb = new ConnectionBean(CASSANDRA_DB_IP, CASSANDRA_DB_NAME, CASSANDRA_USER, CASSANDRA_PASSWORD);

    auth.jdbcAuthentication().usersByUsernameQuery(usersQuery).authoritiesByUsernameQuery(rolesQuery)
            .dataSource(dataSource).passwordEncoder(bCryptPasswordEncoder);
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    // Not using Spring CSRF here to be able to use plain HTML for the login page

    http.csrf().disable()

            // Register our CustomRequestCache, that saves unauthorized access attempts, so
            // the user is redirected after login.
            .requestCache().requestCache(new CustomRequestCache())

            // Restrict access to our application.
            .and().authorizeRequests()

            // Allow all flow internal requests.
            .requestMatchers(SecurityUtils::isFrameworkInternalRequest).permitAll()

            // Allow all requests by logged in users.
            .anyRequest().authenticated()

            // Configure the login page.
            .and().formLogin().loginPage(LOGIN_URL).permitAll().loginProcessingUrl(LOGIN_PROCESSING_URL)
            .failureUrl(LOGIN_FAILURE_URL)

            // Register the success handler that redirects users to the page they last tried
            // to access
            .successHandler(new SavedRequestAwareAuthenticationSuccessHandler())

            // Configure logout
            .and().logout().logoutSuccessUrl(LOGOUT_SUCCESS_URL);
}

/**
 * Allows access to static resources, bypassing Spring security.
 */
@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers(
            // Vaadin Flow static resources
            "/VAADIN/**",

            // the standard favicon URI
            "/favicon.ico",

            // web application manifest
            "/manifest.json", "/sw.js", "/offline-page.html",

            // icons and images
            "/icons/**", "/images/**",

            // (development mode) static resources
            "/frontend/**",

            // (development mode) webjars
            "/webjars/**",

            // (development mode) H2 debugging console
            "/h2-console/**",

            // (production mode) static resources
            "/frontend-es5/**", "/frontend-es6/**");
}

}

最后,下面是查询cassandra数据的类:

public class getData {
Session session;

public getData(){
    session = Connection.getConnection();
    getDataTable();
}

private void getDataTable() {
    try {
        String query = "SELECT * FROM tableName";
        ResultSet rs = session.execute(query);
        for (Row row : rs) {
            /*Do some stuff here using row*/
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
}

}

1 个答案:

答案 0 :(得分:1)

如果每个请求都被调用#include <iostream> #include <iomanip> #include <string> using namespace std; int main(){ string n="7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450"; unsigned long long int mx=0,ths; for(int i=0;i<989;i++){ unsigned long long int ths=(n[i]-'0')*(n[i+1]-'0')*(n[i+2]-'0')*(n[i+3]-'0')*(n[i+4]-'0')*(n[i+5]-'0')*(n[i+6]-'0')*(n[i+7]-'0')*(n[i+8]-'0')*(n[i+9]-'0')*(n[i+10]-'0')*(n[i+11]-'0')*(n[i+12]-'0'); if(ths>mx){ mx=ths; } } cout<<mx; } ,则每次都将创建一个新的getConnection()实例。

不建议这样做,因为在每个Cluster实例的客户端和C *节点之间创建了一个连接,并且对于每个Cluster,为每个C *创建了至少一个连接的连接池节点。

如果请求完成后没有关闭Session实例,则这些连接将保持打开状态。经过多次请求后,您将打开许多连接,以致操作系统中的文件描述符用完了。

要解决此问题,请仅创建一个ClusterCluster实例,并在请求之间重用它。 4 simple rules when using the DataStax drivers for Cassandra中概述了此策略:

  
      
  1. 每个(物理)集群(每个应用程序生命周期)使用一个集群实例
  2.   
  3. 每个键空间最多使用一个会话,或者使用一个会话并在查询中明确指定键空间
  4.