Můžu se prosím ještě zeptat jestli mám dobře navrženou komunikaci server- databáze? Že nejsem si ještě jistý jestli jsem jí navrhl dobře, tak aby se vzájemně nerušila.
Je okey tato architektura?
Jsem si založil pro komunikaci s MYSQL serverem samostatnou třídu, tím že v jejím konstruktoru se sestaví ConnectionString a vloží se do MySqlConnection a poté jednotlivé metody této třídy budou otevírat a opět zase zavírat spojení a dále se dotazovat databázky a ukládat do ní další data.
Ale jde mi spíš hlavně o to, že pak v hlavním programu jsem si vytvořil jednu statickou instanci této třídy, takže všechny nová vlákna, která se vytvoří pro jednotlivé klienty budou využívat tuto stejnou instanci. Otázka kterou si kladu je co se stane, když program z více vláken zavolá stejnou metodu této třídy, která bude přistupovat do této databáze a vrtat se v ní, jestli to bude ok? Nebo jestli program spadne - jako podobně to bylo s tou internetovou komunikací (jak jsem tam pak musel přidat ty věci na tu synchronizaci vláken :D)
Nebo je to lepší předělat, tak aby se vždy založila nová instance této třídy extra v každé metodě, která bude volat nějakou její metodu?
Takto nějak vypadá ta třída pro tu komunikaci s databázkou:
using System;
using System.Collections.Generic;
using System.Net;
using System.Text;
using MonopolyServer.Server.Data;
using MySql.Data;
using MySql.Data.MySqlClient;
namespace MonopolyServer.Database
{
class Connection
{
private MySqlConnection mySqlConnection = null;
public Connection()
{
mySqlConnection = new MySqlConnection();
try {
MySqlConnectionStringBuilder mysqlConfiguration = new MySqlConnectionStringBuilder();
mysqlConfiguration.Database = "monopoly";
mysqlConfiguration.Server = Dns.GetHostName();
// mysqlConfiguration.Server = "192.168.1.102";
mysqlConfiguration.Port = 3306;
mysqlConfiguration.UserID = "server";
mysqlConfiguration.Password = "Monopoly123";
mySqlConnection.ConnectionString = mysqlConfiguration.ConnectionString;
}
catch(Exception ex)
{
Console.WriteLine(ex.ToString());
}
finally
{
mySqlConnection.Close();
}
}
public bool IsNickFree(string nick)
{
try
{
mySqlConnection.Open();
MySqlCommand command = new MySqlCommand();
command.Connection = mySqlConnection;
command.CommandType = System.Data.CommandType.Text;
command.CommandText = "SELECT nick FROM player WHERE nick = @nick";
MySqlParameter param = new MySqlParameter("@nick", MySqlDbType.VarChar);
param.Value = nick;
command.Parameters.Add(param);
using (MySqlDataReader mySqlDataReader = command.ExecuteReader())
{
if (mySqlDataReader.Read()) //vrati true pokud byl uspesne nacten dalsi radek
{
return false;
}
return true;
}
}
finally
{
mySqlConnection.Close();
}
}
public bool RegisterNewPlayer(User user)
{
return true;
}
}
}
Díky moc :-))