Меня вот очень интересует, можно ли использовать текстовые файлы вместо бд. Вот пример на C# ... StreamReader sr = new StreamReader("db.txt"); ... Здесь меня больше всего интересует следуещее: что произойдет, когда много людей-посетителей сайта обратятся к текстовому файлу, будут создаваться потоки, и по идее должно произойти что-то страшное. Но нет, у меня на сайте так работает гостевая книга (стырил пример из книги), вроде никаких сбоев не было. Ведь по идее бд - те же текстовые файлы, и к ним тоже одновременно обращается много людей.
При чтении ничего страшного не произойдет... незнаю как подробно организованна запись в asp.net , имхо было бы разумно, организовать поочередную запись в файл... если вот имхо писать аналогично например на Си & WinAPI , то можно было бы например через api блокировать файл на запись(аля FILE_SHARE_READ) при записи в него и разблокировать сразу после записи , а перед попыткой записать делать проверку не заблокирован ли он на запись др процессом, если занят, то слип милисек(и приэтом надо учеть что содержимое файла изменилось), и снова проверку... канешн кривой вариант, тк имхо в .net наверняка уже реализованно нечто подобное...
вот только БД умная )). это сколько? А вообще делается это так. Выделяешь объект, который умеет работать с данными. Это DAO - data access object. Там вся информация о местоположении данных, например, настройки БД. Все операции с данными только через него. Больше никакая часть программы не знает как взять данные. К этому DAO обращаются другие твои объекты - из следующего уровня - уровня логики твоего приложения - говорят DAO - дай мне объект - DAO связывается с БД и возвращает объект/производит действие какое-то. Так вот синхронизация данных осуществляется как раз при помощи этого DAO. Если рассматривать на примитивном уровне - то это всякие synchronized методы. шаблон singleton так же в помощь. На более высоком уровне - это уже работа с бд, где она сама синхронизирует данные и разработчику нужно следить только за кол-вом одновременных подключений к базе данных - у бд оно ограничено - надо ограничивать и со стороны приложения, чтобы все не падало(я про пул коннектеров). Ну а если рассматривать на совсем нормальном уровне - то юзаешь фрэймворк, который закрывает от тебя всю работу с бд =)). Например, hibernate.
вобщем как я понял, можно юзать текстовые файлы. ура!!! не знаю как в php, но в asp net очень муторно работать с бд вот пример инициализации простейшей бд Code: private static OleDbConnection con = null; private static OleDbCommand selectCommand = null; private static OleDbCommand updateCommand = null; private static OleDbCommand deleteCommand = null; private static OleDbCommand insertCommand = null; private static OleDbDataAdapter adapter = null; public static DataSet ds = null; /// <summary> /// Загрузка базы данных /// </summary> public static void LoadData(string path) { con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + path); selectCommand = new OleDbCommand("SELECT * FROM MainTable", con); insertCommand = new OleDbCommand("INSERT INTO `MainTable` (`Number`, `Nick`, `Password`, `Mail`, `WMZ`, `Referer`, `Level`, `Money`) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", con); insertCommand.Parameters.AddRange(new OleDbParameter[] { new OleDbParameter("Number", OleDbType.Integer, 0, "Number"), new OleDbParameter("Nick", OleDbType.VarWChar, 0, "Nick"), new OleDbParameter("Password", OleDbType.VarWChar, 0, "Password"), new OleDbParameter("Mail", OleDbType.VarWChar, 0, "Mail"), new OleDbParameter("WMZ", OleDbType.VarWChar, 0, "WMZ"), new OleDbParameter("Referer", OleDbType.VarWChar, 0, "Referer"), new OleDbParameter("Level", OleDbType.Integer, 0, "Level"), new OleDbParameter("Money", OleDbType.Integer, 0, "Money")}); updateCommand = new OleDbCommand("UPDATE `MainTable` SET `Number` = ?, `Nick` = ?, `Password` = ?, `Mail` = ?, `WMZ` = ?, `Referer` = ?, `Level` = ?, `Money` = ? WHERE ((`Number` = ?) AND ((? = 1 AND `Nick` IS NULL) OR (`Nick` = ?)) AND ((? = 1 AND `Password` IS NULL) OR (`Password` = ?)) AND ((? = 1 AND `Mail` IS NULL) OR (`Mail` = ?)) AND ((? = 1 AND `WMZ` IS NULL) OR (`WMZ` = ?)) AND ((? = 1 AND `Referer` IS NULL) OR (`Referer` = ?)) AND ((? = 1 AND `Level` IS NULL) OR (`Level` = ?)) AND ((? = 1 AND `Money` IS NULL) OR (`Money` = ?)))", con); updateCommand.Parameters.AddRange(new OleDbParameter[] { new OleDbParameter("Number", OleDbType.Integer, 0, "Number"), new OleDbParameter("Nick", OleDbType.VarWChar, 0, "Nick"), new OleDbParameter("Password", OleDbType.VarWChar, 0, "Password"), new OleDbParameter("Mail", OleDbType.VarWChar, 0, "Mail"), new OleDbParameter("WMZ", OleDbType.VarWChar, 0, "WMZ"), new OleDbParameter("Referer", OleDbType.VarWChar, 0, "Referer"), new OleDbParameter("Level", OleDbType.Integer, 0, "Level"), new OleDbParameter("Money", OleDbType.Integer, 0, "Money"), new OleDbParameter("Original_Number", OleDbType.Integer, 0, ParameterDirection.Input, false, 0, 0, "Number", DataRowVersion.Original, null), new OleDbParameter("IsNull_Nick", OleDbType.Integer, 0, ParameterDirection.Input, 0, 0, "Nick", DataRowVersion.Original, true, null), new OleDbParameter("Original_Nick", OleDbType.VarWChar, 0, ParameterDirection.Input, false, 0, 0, "Nick", DataRowVersion.Original, null), new OleDbParameter("IsNull_Password", OleDbType.Integer, 0, ParameterDirection.Input, 0, 0, "Password", DataRowVersion.Original, true, null), new OleDbParameter("Original_Password", OleDbType.VarWChar, 0, ParameterDirection.Input, false, 0, 0, "Password", DataRowVersion.Original, null), new OleDbParameter("IsNull_Mail", OleDbType.Integer, 0, ParameterDirection.Input, 0, 0, "Mail", DataRowVersion.Original, true, null), new OleDbParameter("Original_Mail", OleDbType.VarWChar, 0, ParameterDirection.Input, false, 0, 0, "Mail", DataRowVersion.Original, null), new OleDbParameter("IsNull_WMZ", OleDbType.Integer, 0, ParameterDirection.Input, 0, 0, "WMZ", DataRowVersion.Original, true, null), new OleDbParameter("Original_WMZ", OleDbType.VarWChar, 0, ParameterDirection.Input, false, 0, 0, "WMZ", DataRowVersion.Original, null), new OleDbParameter("IsNull_Referer", OleDbType.Integer, 0, ParameterDirection.Input, 0, 0, "Referer", DataRowVersion.Original, true, null), new OleDbParameter("Original_Referer", OleDbType.VarWChar, 0, ParameterDirection.Input, false, 0, 0, "Referer", DataRowVersion.Original, null), new OleDbParameter("IsNull_Level", OleDbType.Integer, 0, ParameterDirection.Input, 0, 0, "Level", DataRowVersion.Original, true, null), new OleDbParameter("Original_Level", OleDbType.Integer, 0, ParameterDirection.Input, false, 0, 0, "Level", DataRowVersion.Original, null), new OleDbParameter("IsNull_Money", OleDbType.Integer, 0, ParameterDirection.Input, 0, 0, "Money", DataRowVersion.Original, true, null), new OleDbParameter("Original_Money", OleDbType.Integer, 0, ParameterDirection.Input, false, 0, 0, "Money", DataRowVersion.Original, null)}); deleteCommand = new OleDbCommand("DELETE FROM `MainTable` WHERE ((`Number` = ?) AND ((? = 1 AND `Nick` IS NULL) OR (`Nick` = ?)) AND ((? = 1 AND `Password` IS NULL) OR (`Password` = ?)) AND ((? = 1 AND `Mail` IS NULL) OR (`Mail` = ?)) AND ((? = 1 AND `WMZ` IS NULL) OR (`WMZ` = ?)) AND ((? = 1 AND `Referer` IS NULL) OR (`Referer` = ?)) AND ((? = 1 AND `Level` IS NULL) OR (`Level` = ?)) AND ((? = 1 AND `Money` IS NULL) OR (`Money` = ?)))", con); deleteCommand.Parameters.AddRange(new OleDbParameter[] { new OleDbParameter("Original_Number", OleDbType.Integer, 0, ParameterDirection.Input, false, 0, 0, "Number", DataRowVersion.Original, null), new OleDbParameter("IsNull_Nick", OleDbType.Integer, 0, ParameterDirection.Input, 0, 0, "Nick", DataRowVersion.Original, true, null), new OleDbParameter("Original_Nick", OleDbType.VarWChar, 0, ParameterDirection.Input, false, 0, 0, "Nick", DataRowVersion.Original, null), new OleDbParameter("IsNull_Password", OleDbType.Integer, 0, ParameterDirection.Input, 0, 0, "Password", DataRowVersion.Original, true, null), new OleDbParameter("Original_Password", OleDbType.VarWChar, 0, ParameterDirection.Input, false, 0, 0, "Password", DataRowVersion.Original, null), new OleDbParameter("IsNull_Mail", OleDbType.Integer, 0, ParameterDirection.Input, 0, 0, "Mail", DataRowVersion.Original, true, null), new OleDbParameter("Original_Mail", OleDbType.VarWChar, 0, ParameterDirection.Input, false, 0, 0, "Mail", DataRowVersion.Original, null), new OleDbParameter("IsNull_WMZ", OleDbType.Integer, 0, ParameterDirection.Input, 0, 0, "WMZ", DataRowVersion.Original, true, null), new OleDbParameter("Original_WMZ", OleDbType.VarWChar, 0, ParameterDirection.Input, false, 0, 0, "WMZ", DataRowVersion.Original, null), new OleDbParameter("IsNull_Referer", OleDbType.Integer, 0, ParameterDirection.Input, 0, 0, "Referer", DataRowVersion.Original, true, null), new OleDbParameter("Original_Referer", OleDbType.VarWChar, 0, ParameterDirection.Input, false, 0, 0, "Referer", DataRowVersion.Original, null), new OleDbParameter("IsNull_Level", OleDbType.Integer, 0, ParameterDirection.Input, 0, 0, "Level", DataRowVersion.Original, true, null), new OleDbParameter("Original_Level", OleDbType.Integer, 0, ParameterDirection.Input, false, 0, 0, "Level", DataRowVersion.Original, null), new OleDbParameter("IsNull_Money", OleDbType.Integer, 0, ParameterDirection.Input, 0, 0, "Money", DataRowVersion.Original, true, null), new OleDbParameter("Original_Money", OleDbType.Integer, 0, ParameterDirection.Input, false, 0, 0, "Money", DataRowVersion.Original, null)}); adapter = new OleDbDataAdapter(selectCommand); adapter.DeleteCommand = deleteCommand; adapter.InsertCommand = insertCommand; adapter.UpdateCommand = updateCommand; adapter.TableMappings.AddRange(new DataTableMapping[] { new DataTableMapping("Table", "MainTable", new DataColumnMapping[] { new DataColumnMapping("Number", "Number"), new DataColumnMapping("Nick", "Nick"), new DataColumnMapping("Password", "Password"), new DataColumnMapping("Mail", "Mail"), new DataColumnMapping("WMZ", "WMZ"), new DataColumnMapping("Referer", "Referer"), new DataColumnMapping("Level", "Level"), new DataColumnMapping("Money", "Money")})}); ds = new DataSet(); adapter.Fill(ds, "MainTable"); xml тоже хорошая тема, но для больших бд он имхо не подойдет, т.к. только на теги уйдет много килобайт.
муахахаха! А как же оптимизация/синхронизация/серверные фичи?)) Бред, кури доки по ASP.NET, а пример этот левый )