所以,在研究了这个很多之后,我正在为遇到这个并找到出路的人寻求帮助。
我们为客户开发了一个PTC脚本并且工作正常,但随着用户的增长,它开始显示错误,如下所示:
错误:(1226)用户'qe'已超出'max_user_connections'资源(当前值:30)
现在在寻求帮助之后,有人说它与服务器有关,而其他人指出这是与脚本数据库设计有关的问题。
期待一种解决这个问题的方法。已经尝试了很多东西。
目前使用godaddy托管,他们将限制从30增加到50,但我确定问题会再次出现。
答案 0 :(得分:-1)
数据库没有问题,问题在于如何处理来自软件的数据库连接。
您的脚本设置方式是,与Web服务器的每个连接也会打开与MySQL的连接。那不是你想要的场景。
提高限制不会解决问题,它只会延迟另一个错误。你应该做的是使用持久连接。
首选使用php-fpm
而不是mod_php
等服务器API的原因之一是因为启动了一定数量的PHP进程并创建了与服务的连接池。
流程如下:
php-fpm
。 Apache
和nginx
可以使用FCGI界面与php-fpm
进程通信php-fpm
筹集相对较少的子流程。这不应该过大,默认配置通常会有效,我会猜测你没有运行hexacore系统,所以4-6个子进程应该没问题这是做什么的?您的服务器接受请求并将其发送到php-fpm
,Apache
会在空闲时对其进行处理。每个进程使用1个与MySQL的连接。这意味着你永远不会像你一样达到某种严格的限制。
如果您的服务器很忙,服务器应该排队请求,直到PHP能够处理它们。无论您使用nginx
还是php-fpm
,这种方法都能很好地运作。
如果您的网站很忙,那么Web服务器可能会更快地接受连接并提供PHP处理动态内容的静态内容。在这种情况下,您可以选择添加另一台运行import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import org.bouncycastle.asn1.x500.X500Name;
import org.bouncycastle.asn1.x500.X500NameBuilder;
import org.bouncycastle.asn1.x500.style.BCStyle;
import org.bouncycastle.openssl.PEMWriter;
import org.bouncycastle.operator.ContentSigner;
import org.bouncycastle.operator.OperatorCreationException;
import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder;
import org.bouncycastle.pkcs.PKCS10CertificationRequest;
import org.bouncycastle.pkcs.PKCS10CertificationRequestBuilder;
import org.bouncycastle.pkcs.jcajce.JcaPKCS10CertificationRequestBuilder;
public class CreateKeyTest {
public static void main(String[] args) throws OperatorCreationException, IOException, GeneralSecurityException {
KeyPairGenerator kpg;
KeyPair kp;
RSAPublicKey pubKey;
RSAPrivateKey privKey;
FileOutputStream out;
KeyStore ks;
FileInputStream in;
FileInputStream bFis;
try {
ks = KeyStore.getInstance("JKS");
kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(1024);
kp = kpg.generateKeyPair();
pubKey = (RSAPublicKey) kp.getPublic();
privKey = (RSAPrivateKey) kp.getPrivate();
// generate CSR
ContentSigner sign = new JcaContentSignerBuilder("SHA1withRSA").build(privKey);
X500NameBuilder nBuilder = new X500NameBuilder();
nBuilder.addRDN(BCStyle.CN, "TestCSR");
nBuilder.addRDN(BCStyle.C, "ER");
nBuilder.addRDN(BCStyle.E, "test@test.com");
X500Name name = nBuilder.build();
PKCS10CertificationRequestBuilder cerReq = new JcaPKCS10CertificationRequestBuilder(name, pubKey);
PKCS10CertificationRequest request = cerReq.build(sign);
PEMWriter pWr = new PEMWriter(new FileWriter(new File("D:\\test.csr")));
pWr.writeObject(request);
pWr.flush();
pWr.close();
bFis = new FileInputStream("D:\\test.csr");
BufferedInputStream ksbufin = new BufferedInputStream(bFis);
X509Certificate certificate = (X509Certificate) CertificateFactory.getInstance("X.509")
.generateCertificate(ksbufin);
ks.setKeyEntry("RSA_key", kp.getPrivate(), "changeit".toCharArray(),
new java.security.cert.Certificate[] { certificate });
out = new FileOutputStream("key.store");
ks.store(out, "changeit".toCharArray());
System.out.println("New Keystore Generated");
out.close();
} catch (KeyStoreException | IOException | CertificateException | NoSuchAlgorithmException
| OperatorCreationException e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
}
的物理机器(或更多)。对于两个提到的Web服务器,指示您的Web服务器在为PHP提供服务的计算机之间进行循环操作是微不足道的。
最重要的是,您希望以最佳方式利用资源。在每个请求上打开和关闭MySQL连接都不是最佳选择。池连接是。