如何为第三方应用程序创建连接池/仅创建一次?

时间:2019-03-19 08:11:17

标签: java spring spring-mvc connection-pooling

我正在使用JAVA / Spring MVC,并且由于我尝试多次连接应用程序和服务器系统使用100%RAM时,我需要为应用程序中的第三方应用程序集成创建连接池。

在这里我要解决的问题是,当用户多次尝试使用特定方法(callGenerationService())时,我的堆内存(RAM空间)会增加并变为100%,并且应用程序会变慢,因为它会连接第三方申请多次?在这里,我只需要创建一次connection并多次获取即可。我的联系在哪里,

public class ClickToCallServiceImpl implements ClickToCallServiceInterface {
Client client = null;
@Override
public ClickToCall callGenerationService(ClickToCall clickToCall) {
     client = new Client();
     client.connect("127.0.0.1", 8021 , "password", 10); //Every time Connection Connect.
     client.setEventSubscriptions("plain", "all");
     // client.sendSyncApiCommand("",""); //here i run command on every hit like.
    client.sendSyncApiCommand(clickToCall.command1, clickToCall.command2);
    client.close();
}
}
  

这里的'ClickToCall'是一个@Component Bean / POJO类,带有变量设置器和获取器。

在这里,我们如何为上述连接创建一个connection (either pool or only once connect),而我只连接一次并多次命中clickToCall.Command1 and clickToCall.Command2并占用较少的RAM?预先感谢。

1 个答案:

答案 0 :(得分:1)

请注意,我不是freeswitch esl的专家,因此您必须正确检查代码。无论如何,这就是我要做的。

首先,我为客户端创建工厂

public class FreeSwitchEslClientFactory extends BasePooledObjectFactory<Client> {

    @Override
    public Client create() throws Exception {
        //Create and connect: NOTE I'M NOT AN EXPERT OF ESL FREESWITCH SO YOU MUST CHECK IT PROPERLY
        Client client = new Client();
        client.connect("127.0.0.1", 8021 , "password", 10);
        client.setEventSubscriptions("plain", "all");
        return client;
    }

    @Override
    public PooledObject<Client> wrap(Client obj) {

        return new DefaultPooledObject<Client>(obj);
    }
}

然后我创建一个可共享的GenericObjectPool

@Configuration
@ComponentScan(basePackages= {"it.olgna.spring.pool"})
public class CommonPoolConfig {

    @Bean("clientPool")
    public GenericObjectPool<Client> clientPool(){
        GenericObjectPool<Client> result = new GenericObjectPool<Client>(new FreeSwitchEslClientFactory());
        //Pool config e.g. max pool dimension
        result.setMaxTotal(20);
        return result;
    }
}

最后,我使用创建的池来获取客户端obj:

@Component
public class FreeSwitchEslCommandSender {

    @Autowired
    @Qualifier("clientPool")
    private GenericObjectPool<Client> pool;

    public void sendCommand(String command, String param) throws Exception{
        Client client = null;
        try {
            client = pool.borrowObject();
            client.sendSyncApiCommand(command, param);
        } finally {
            if( client != null ) {
                client.close();
            }
            pool.returnObject(client);
        }
    }
}

我没有测试(也是因为我无法测试),但是它应该可以工作。无论如何,我祈祷您正确检查配置。我不知道总是可以创建Client对象并进行连接还是在发送命令时进行连接是否更好

我希望它会有用

编辑信息

对不起,我很早就犯了一个错误。您必须将客户端返回池中 我更新了FreeSwitchEslCommandSender类

天使