vibed 앱에서 MySQL/MariaDB 데이터베이스에 연결할 수 없음
커스텀 메인(custom main)을 사용하면 모두 정상적으로 동작합니다.void main()
대신shared static this()
).
기본 메인으로 "Access Violation" 오류가 발생합니다.MySQL이 다음 위치에서 접속을 허용하지 않는 것 같습니다.localhost
my.ini에 문자열을 추가했습니다.
bind-address = 127.0.0.1
코드(도움말인 경우):
import std.stdio;
import std.path;
import std.file;
import std.string;
import dini;
import vibe.d;
import colorize;
import ddbc.all;
shared static this()
{
auto settings = new HTTPServerSettings;
settings.port = 8080;
settings.bindAddresses = ["::1", "127.0.0.1"];
listenHTTP(settings, &hello);
auto parseconfig = new ParseConfig();
auto db = new DBConnect(parseconfig);
}
void hello(HTTPServerRequest req, HTTPServerResponse res)
{
res.writeBody("Hello, World!");
}
class ParseConfig
{
string dbname;
string dbuser;
string dbpass;
string dbhost;
string dbport;
this()
{
try
{
//getcwd do not return correct path if run from task shoulder
string confpath = buildPath((thisExePath[0..((thisExePath.lastIndexOf("\\"))+1)]), "config.ini");
//writefln(thisExePath[0..((thisExePath.lastIndexOf("\\"))+1)]); // get path without extention +1 is for getting last slash
//string confpath = buildPath(thisExePath, "config.ini");
if (!exists(confpath))
{
writeln("ERROR: config.ini do not exists");
}
auto config = Ini.Parse(confpath);
try
{
this.dbname = config.getKey("dbname");
this.dbuser = config.getKey("dbuser");
this.dbpass = config.getKey("dbpass");
this.dbhost = config.getKey("dbhost");
this.dbport = config.getKey("dbport");
}
catch (Exception msg)
{
cwritefln("ERROR: Can't parse config: %s".color(fg.red), msg.msg);
}
}
catch(Exception msg)
{
cwriteln(msg.msg.color(fg.red));
core.thread.Thread.sleep( dur!("msecs")(1000));
}
}
}
class DBConnect
{
Statement stmt;
ParseConfig parseconfig;
this(ParseConfig parseconfig)
{
try
{
this.parseconfig = parseconfig;
MySQLDriver driver = new MySQLDriver();
string url = MySQLDriver.generateUrl(parseconfig.dbhost, to!short(parseconfig.dbport), parseconfig.dbname);
string[string] params = MySQLDriver.setUserAndPassword(parseconfig.dbuser, parseconfig.dbpass);
DataSource ds = new ConnectionPoolDataSourceImpl(driver, url, params);
auto conn = ds.getConnection();
scope(exit) conn.close();
stmt = conn.createStatement();
writefln("\n[Database connection OK]");
}
catch (Exception ex)
{
writefln(ex.msg);
writeln("Could not connect to DB. Please check settings");
}
}
}
또한 다음 명령을 실행합니다.
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION; FLUSH PRIVILEGES;
또한 나는 다르게 시도했다.bind-address
예를 들어 다음과 같습니다.0.0.0.0
그리고.localhost
하지만 결과는 없었다.새로운 바인딩을 할 때마다 MySQL 서비스를 재시작했습니다.
이 드라이버는 http://code.dlang.org/packages/ddbc 에서 사용하고 있습니다.
뭐가 잘못됐나요?
코멘트를 계속합니다(Vibed app에서 MySQL/MariaDB 데이터베이스에 연결할 수 없습니다).
방금 테스트했는데, 확실히 이벤트 루프입니다.
대신:
auto parseconfig = new ParseConfig();
auto db = new DBConnect(parseconfig);
다음 작업을 수행합니다.
runTask({
auto parseconfig = new ParseConfig();
auto db = new DBConnect(parseconfig);
});
(DMD 2.067.0 / Vibe 0.7.23 / ddbc 0.2.24 / colorize & dini master )에 대응.
코멘트에 응답하기 위해서(Vibed App에서 MySQL/MariaDB 데이터베이스에 접속할 수 없습니다) : 메인 기능 내에서 이벤트 루프가 시작됩니다.D 어플리케이션을 실행하면 어떻게 됩니까?엔트리 포인트는 런타임 내의 C 메인입니다.이 메인(모듈 컨스트럭터 포함)은 모듈 컨스트럭터를 포함하여 초기화하고 가장 짧은 실행(-unittest로 컴파일한 경우)을 실행한 다음 메인(이름은 "_Dmain"으로 GDB로 브레이크 포인트를 설정할 때 유용합니다)을 호출합니다.Vibe.d의 메인이 호출되면 명령줄 인수(옵션 설정 파일)를 해석하고 마지막으로 이벤트루프를 시작합니다.이벤트 루프가 시작되면 실행하려는 모든 코드는runTask
및 유사, 또는createTimer
스태틱 컨스트럭터에서 직접 코드를 호출해서는 안 됩니다(실제로 Vibe.d로 시작하는 경우 가장 일반적인 오류 중 하나입니다).
대체 MySQL/MariaDB 드라이버인 mysql-litted를 개발하다가 관련된 문제가 발생했습니다.
이 문제는 phobos/SHA1의 모듈 초기화 오더 버그와 관련된 것으로 생각되며 2.067.1에서는 아직 해결되지 않았다고 생각합니다.대신 Vibe Custom Main을 사용하여 자체 메인()을 정의하는 것이 좋습니다.defaul main()을 appmain.d에서 복사하여 사용할 수 있습니다.
또는 mysql-lited를 사용해보고 그것이 당신에게 더 적합한지 확인할 수 있습니다.
언급URL : https://stackoverflow.com/questions/30302161/cant-connect-to-mysql-mariadb-database-from-vibed-app
'source' 카테고리의 다른 글
Iterator와 Listiterator의 차이점 (0) | 2022.09.13 |
---|---|
jQuery에서 체크박스가 켜져 있는지 확인합니다. (0) | 2022.09.13 |
기존 값보다 큰 값의 첫 번째 발생 횟수 (0) | 2022.09.12 |
로컬에 설치된 Python 모듈 목록을 가져오려면 어떻게 해야 합니까? (0) | 2022.09.12 |
mysql_module_array()/module_module_assoc()/module_module_num_rows 등...파라미터 1이 리소스가 될 것으로 예상합니다. (0) | 2022.09.12 |